计算机文件是以计算机硬盘为载体存储在计算机上的信息集合。文件可以是文本文档、图片、程序等等。文件通常具有三个字母的文件扩展名,用于指示文件类型(例如,图片文件常常以 JPEG 格式保存并且文件扩展名为 .jpg)。
一个程序在运行过程中用了九牛二虎之力终于计算出了结果,试想一下如果不把这些数据存放起来,相比重启电脑之后,“哭都没地方哭了”。 默认数据是加载到内存中,结果也是保存到内存中, 程序执行结束,所有的数据释放。
在操作文件的整体过程与将大象放入冰箱的过程是很相似的。
文件的打开
在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件。
open(文件名,访问模式) e.g. f = open(‘test.txt’, ‘w’)
如果文件不存在那么创建,如果存在那么就先清空,然后写入数据
要读取二进制文件,比如图片、视频等等,用’rb’, ‘wb’, 'ab’等模式打开文件即可.
File文件的属性
seek(offset, from)有2个参数:
offset:偏移量
from:方向 0:表示文件开头; 1:表示当前位置; 2:表示文件末尾
输入文件的名字,然后程序自动完成对文件进行备份。
import os
oldFileName = input("请输入要拷贝的文件名字:")
# 判断要拷贝的文件是否存在?如果不存在, 则报错并退出.
if not os.path.exists(oldFileName):
print("文件 %s 不存在" % (oldFileName))
exit(1)
with open(oldFileName, 'r') as oldFile:
# 提取文件的后缀
fileFlagNum = oldFileName.rfind('.')
if fileFlagNum > 0:
fileFlag = oldFileName[fileFlagNum:]
# 组织新的文件名字
newFileName = oldFileName[:fileFlagNum] + '_备份' + fileFlag
else:
newFileName = oldFileName + '_备份'
# 创建新文件
newFile = open(newFileName, 'w')
# 把旧文件中的数据,一行一行的进行复制到新文件中
for lineContent in oldFile.readlines():
newFile.write(lineContent)
newFile.close()
print("文件 [%s] 备份为 [%s] 成功" % (oldFileName, newFileName))
os,语义为操作系统,处理操作系统相关的功能,可跨平台。 比如显示当前目录下所有文件/删除某个文件/获取文件大小……
import os
# 1). 返回操作系统类型, 值为posix,是Linux操作系统, 值为nt, 是windows操作系统
print(os.name)
print('Linux' if os.name=='posix' else 'Windows')
# 2). 操作系统的详细信息
info = os.uname()
print(info)
print(info.sysname)
print(info.nodename)
# 3). 系统环境变量
print(os.environ)
# 4). 通过key值获取环境变量对应的value值
print(os.environ.get('PATH'))
print(os.getenv('PATH'))
import os
import random
from os.path import exists, splitext, join
# 1. 判断是否为绝对路径---'/tmp/hello', 'hello.png', 'qq/hello.mp3'
print(os.path.isabs('/tmp/hello'))
print(os.path.isabs('hello'))
# 2. 生成绝对路径
print(os.path.abspath('/tmp/hello'))
print(os.path.abspath('hello.png'))
# 3. 'hello.png'
print(os.path.join('/home/kiosk', 'hello.png'))
# 返回一个绝对路径: 当前目录的绝对路径+ 文件名/目录名
print(os.path.join(os.path.abspath('.'), 'hello.png'))
# 4.获取目录名或者文件名
filename = '/home/kiosk/Desktop/201808python/day10/hello.png'
print(os.path.basename(filename))
print(os.path.dirname(filename))
#5. 创建目录/删除目录
mkdir -p qq/qq1/qq1 递归创建目录
os.makedirs('img/films')
os.mkdir('img')
os.rmdir('img')
# 6. 创建文件/删除文件
os.mknod('00_ok.txt')
os.remove('00_ok.txt')
# 7. 文件重命名(mv)
os.rename('data.txt', 'data1.txt')
# 8. 判断文件或者目录是否存在
print(os.path.exists('img'))
# 9. 分离后缀名和文件名
print(os.path.splitext('hello.png'))
print(os.path.split('hello.png'))
# 10. 将目录名和文件名分离
print(os.path.split('/tmp/hello/hello.png'))
os模块中的rename()可以完成对文件的重命名操作。
rename(需要修改的文件名, 新的文件名)
os模块中的remove()可以完成对文件的删除操作
remove(待删除的文件名)
1. 在当前目录新建目录img, 里面包含100个文件, 100个文件名各不相同(X4G5.png)
2. 将当前img目录所有以.png结尾的后缀名改为.jpg.
代码如下:
import string
def gen_code(len=4):
# 随机生成4位的验证码
li = random.sample(string.ascii_letters+string.digits, len)
# 将列表元素拼接为字符串
return "".join(li)
def create_files(dirname):
# 随机生成100个验证码
li = {gen_code() for i in range(100)}
if not os.path.exists(dirname):
os.mkdir('img')
# # 随机生成四个数字
for name in li:
os.mknod(dirname +os.path.sep + name + '.png')
create_files('img')
import sys
def modify_suffix(dirname, old_suffix, new_suffix):
"""
:param dirname: 操作的目录
:param old_suffix: 原先的后缀名
:param new_suffix: 新的后缀名
:return:
"""
# 1. 判断查找的目录是否存在, 如果不存在, 显示报错
if exists(dirname):
# 2. 找出所有以old_suffix(.png)结尾的
# pngfiles = [ filename for filename in os.listdir(dirname)
# if filename.endswith(old_suffix)]
pngfiles = filter(lambda filename: filename.endswith(old_suffix), os.listdir(dirname))
# 3. 将文件名和后缀名分开, 留下所有的文件名
basefiles = [splitext(filename)[0] for filename in pngfiles]
print(basefiles)
# 4. 文件重命名
for filename in basefiles:
# 需要加上目录名
oldname = join(dirname, filename + old_suffix)
newname = join(dirname, filename + new_suffix)
os.rename(oldname, newname)
print("%s重命名为%s成功" % (oldname, newname))
else:
print("%s不存在, 不能操作......" % (dirname))
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python等)。
这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
python 中str类型到JSON中转为unicode类型,None转为null,dict对应object;
pyhton中的集合不能转成json格式。
load: 将序列化字符串从文件读取并反序列化
ensure_ascii=False: 中文存储需要设定
indent=4: 增加缩进,增强可读性,但缩进空格会使数据变大
separators=(’,’,’:’): 自定义分隔符,元素间分隔符为逗号, 字典key和value值的分隔符为冒号
sort_keys=True: 字典排序
例如我们碰到集合对象, datetime对象,或者自定义的类对象等json默认不支持的数据类型时,我们就需要自定义编解码函数。有两种方法来实现自定义编解码
import datetime,json
dt = datetime.datetime.now()
def time2str(obj):
#python to json
if isinstance(obj, datetime.datetime):
json_str = {"datetime":obj.strftime("%Y-%m-%d %X")}
return json_str
return obj
def str2time(json_obj):
#json to python
if "datetime" in json_obj:
date_str,time_str = json_obj["datetime"].split(' ')
date = [int(x) for x in date_str.split('-')]
time = [int(x) for x in time_str.split(':')]
dt = datetime.datetime(date[0],date[1], date[2], time[0],time[1], time[2])
return dt
return json_obj
a = json.dumps(dt,default=time2str)
print a
{"datetime": "2016-10-27 17:38:31"}
print json.loads(a,object_hook=str2time)
2016-10-27 17:38:31
python的pickle模块实现了python的所有数据序列和反序列化。与JSON不同的是pickle不是用于多种语言间的数据传输,它仅作为python对象的持久化或者python程序间进行互相传输对象的方法,因此它支持了python所有的数据类型。
cPickle是pickle模块的C语言编译版本相对速度更快。
from datetime import date
import pickle
src_dic = {"date":date.today(),"prices":{100, 20, 100, 90}}
det_str = pickle.dumps(src_dic)
print(det_str)
1、JSON只能处理基本数据类型。pickle能处理所有Python的数据类型。
2、JSON用于各种语言之间的字符转换。pickle用于Python程序对象的持久化或者Python程序间对象网络传输,但不同版本的Python序列化可能还有差异。