一、文件 file
通常建议用内置函数 open() 打开文件,file 用于类型判断。
>>> with open("test.txt", "w") as f:
... print isinstance(f, file) // 类型判断
... f.writelines(map(str, range(10)))
True
File Object 实现了上下文协议,可确保文件被及时关闭。实际上,文件对象被回收时总是会调用 close 方法,所以可以写下面这样的代码。
>>> open("test.txt", "r").read()
'0123456789'
如果要把数据写到磁盘上,除调用 flush() 外,还得用 sync(),以确保数据从系统缓冲区同步到磁盘。close() 总是会调用这两个方法。
打开模式:
- r: 只读。
- w: 只写。已存在文件将被清除 (truncate)。
- a: 添加。总是添加到文件尾部。
- b: 二进制模式。
- r+: 更新文件,可读写,不会截短文件。
- w+: 更新文件,可读写,清除原有内容。
- a+: 更新文件,可读写,总是在尾部添加。
文件对象还实现了迭代器协议,可直接循环获取其内容。
>>> with open("main.py", "r") as f:
... for line in f: print line
...
读方法总能判断不同平台的换行标记,但写方法不会添加任何换行字符,包括 writelines。
>>> with open("test.txt", "w") as f:
... f.write("a")
... f.writelines("bc")
>>> cat test.txt
abc
如必须按不同平台写入换行标记,可使用 os.linesep。
>>> os.linesep
'\n'
字符串本身就是序列类型,可以直接用 writelines(str)。readline() 会返回包括换行符在内的整个行数据。通常建议用迭代器或 xreadlines() 代替 readlines(),后者默认一次性读取整个文件。
二、读取二进制文件
读取二进制文件使用 'rb' 模式。
这里以图片为例:
with open('test.png', 'rb') as f:
image_data = f.read() # image_data 是字节字符串格式的,而不是文本字符串
这里需要注意的是,在读取二进制数据时,返回的数据是字节字符串格式的,而不是文本字符串。一般情况下,我们可能会对它进行编码,比如 base64 编码,可以这样做:
import base64
with open('test.png', 'rb') as f:
image_data = f.read()
base64_data = base64.b64encode(image_data) # 使用 base64 编码
print base64_data
下面是执行结果的一部分:
iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAACGFjVEw
三、写入二进制文件
写入二进制文件使用 'wb' 模式。
以图片为例:
with open('test.png', 'rb') as f:
image_data = f.read()
with open('/Users/ethan/test2.png', 'wb') as f:
f.write(image_data)