Python 八 - 文件IO
文件读写
Python内置的open()函数可以传入文件名和标示符打开一个文件对象
1 | f = open('./test.txt','r') |
r表示读,如果文件不存在open()函数会抛出一个IOError错误
如果文件打开成功,调用read()函数可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示
1 | str = f.read() |
因为文件对象会占用系统资源,所以使用完毕需要调用close()函数关闭文件
Python引入with语句帮助我们自动调用close方法
1 | with open('./file','r') as f: |
read方法可以read(size)每次最多读取size个字节的内容,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list
1 | for line in f.readlines(): |
二进制文件
读取二进制文件比如图片、视频等,用rb模式打开即可:
1 | f = open('./test.jpg','rd') |
字符编码
读取非ASCALL编码的文本文件,必须以二进制模式打开,再解码,比如GBK编码的文件
1 | f = open('./gbk.txt','rb') |
写文件
在open函数传入标识符W或者wb表示写文件或写二进制文件
1 | f = open('./test.txt','w') |
也可以使用with语句
1 | with open('./test.txt','w') as f: |
写入特定编码也需要转码
文件操作
要操作文件需要导入Python内置的os模块
1 | import os |
如果是posix说明系统是Linux、Unix或者Mac OS X,如果是nt就是Windows系统
获取系统详细信息可以调用uname()函数
通过os.environ可以看到系统环境变量的dict
要获取环境变量的某个值可以调用os.getenv()函数
操作文件和目录
- os.path.abspath(‘.’) # 当前目录的绝对路径
- os.path.join(‘/User/zoe’,’testDir’) # 合并路径
- os.path.split(‘/Users/zoe/testDir/file.txt’) # 拆分目录
- os.path.splitext(‘/path/file.txt’) # 拆分文件扩展名
- os.mkdir(‘./testdir’) # 创建目录
- os.rmdir(‘./testdir’) # 删除目录
- os.rename(‘test.txt’,’test.py’) # 重命名
- os.remove(‘test.txt’) # 删除文件
os模块中并没有复制文件可以使用shutil模块提供的copyfile()函数
1 | # 列出当前目录下的所有子目录 |
序列化
Python提供了cPickle和pickle两个模块来实现序列化,两个模块功能一致,区别在于cPickle是C语言写的,速度快,pickle是纯Python写的,速度慢,用的时候先尝试导入cPickle,如果失败了,再导入pickle
1 | try: |
使用pickle.dumps()方法把任意对象序列化成一个str,然后,把str写入文件
也可以使用pickle.dump()直接把对象序列化写入file
1 | d = dict(name='Bob',age=20,score=88) |
反序列化是用pickle.loads()方法通过读取到字符串反序列化出对象,也可以直接用pickle.load()方法从file中直接反序列化出对象
1 | f = open('dump.txt','rb') |
Pickle的缺点很明显,只能用于Python并且可能不同版本的Python批次都不兼容
JSON
JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:
| JSON类型 | Python类型 |
|---|---|
| {} | dict |
| [] | list |
| “string” | str或u”unicode” |
| 1234.56 | int或float |
| true/flase | True/False |
| null | None |
Python内置的json模块提供了完善的Python对象到JSON格式的转换
1 | import json |
同样dump()方法可以直接把JSON写入文件,loads()或load()方法可以把反序列化
JSON进阶
对象序列化,需要实现一个转换函数
1 | import json |
通常class实例都有一个__dict__属性,用来存储实例变量,所以也可以这么写:
1 | json.dumps(s,default=lambda obj:obj.__dict__) |
反序列化时
1 | def dict2student(d): |

