#Python 的文件 I/O
文件读写是最基本的 IO 操作。Python 通过内建函数 open
打开文件,然后返回一个文件 I/O 流的对象。
该对象支持以下常用方法:
方法 | 说明 |
---|---|
close | 关闭文件 I/O 流 |
read | 读取 |
write | 写入 |
tell | 获取当前偏移量 |
seek | 设置偏移量 |
示例:
f = open('./1.txt', 'w', encoding='utf-8') # w 表示以只写模式打开文件,encoding 表示文件的编码
f.write('测试') # 写入字符串
f.close() # 关闭
f = open('./1.txt', 'r', encoding='utf-8') # r 表示以只读模式打开文件,encoding 表示文件的编码
text = f.read() # 读取内容
print(text) # 查看读取到的内容
f.close() # 关闭
#文件的打开模式
r
表示读,如果文件不存在则会报错w
表示写,如果文件已经存在则会清空原文件a
表示追加,打开文件时偏移量在文件末尾+
表示读写b
表示二进制模式,常用于非文本文件,例如图片、可执行文件等
模式 | 说明 | 文件存在 | 文件不存在 | 初始偏移 | 返回值类型 |
---|---|---|---|---|---|
r | 只读 | 打开文件 | 报错 FileNotFoundError | 文件开头 | str |
w | 只写 | 清空文件 | 新建文件 | 文件开头 | str |
a | 追加写 | 打开文件 | 新建文件 | 文件末尾 | str |
r+ | 读写 | 打开文件 | 新建文件 | 文件开头 | str |
w+ | 读写 | 清空文件 | 新建文件 | 文件开头 | str |
a+ | 追加读写 | 打开文件 | 新建文件 | 文件末尾 | str |
rb | 只读 | 打开文件 | 报错 FileNotFoundError | 文件开头 | byets |
wb | 只写 | 清空文件 | 新建文件 | 文件开头 | byets |
ab | 追加写 | 打开文件 | 新建文件 | 文件末尾 | byets |
rb+ | 读写 | 打开文件 | 报错 FileNotFoundError | 文件开头 | byets |
wb+ | 读写 | 清空文件 | 新建文件 | 文件开头 | byets |
ab+ | 追加读写 | 打开文件 | 新建文件 | 文件末尾 | byets |
采用文本模式打开文件时,需要进行编解码。如果不传递
encoding
参数,则使用操作系统指定的编码,在中文 Windows 上默认为 GBK。建议使用现行的主流编码 UTF-8,以避免各种兼容性问题。
#文件的偏移量
文件偏移量标记当前操作文件的位置,在 Python 中使用 tell
方法获取偏移量,seek
方法修改偏移量,在进行读写操作时,偏移量会自动增加。
- 对于文本文件,偏移量的单位是 字符
- 对于二进制文件(使用
b
模式打开),偏移量的单位是 字节
import io # 导入 io 模块
f = open('./1.txt', 'w')
print('打开文件时偏移量为', f.tell()) # 查看偏移量
f.write('ABCDEFGHIJKLMNOPQRSTUVWXYZ') # 写入内容
print('写入文件后偏移量为', f.tell()) # 查看偏移量
f.close()
f = open('./1.txt', 'rb')
print('打开文件时偏移量为', f.tell()) # 查看偏移量
f.seek(10, io.SEEK_SET) # 将偏移量设为,文件开头 + 10 字节
print('当前偏移量为', f.tell())
f.seek(-9, io.SEEK_END) # 将偏移量设为,文件开头 - 9 字节
print('当前偏移量为', f.tell())
f.seek(-5, io.SEEK_CUR) # 将偏移量设为,当前位置 - 5 字节
print('当前偏移量为', f.tell())
在文件的中间进行写入时,不是插入,而是覆盖:
import io # 导入 io 模块
f = open('./1.txt', 'w')
f.write('ABCDEFGHIJKLMNOPQRSTUVWXYZ') # 写入内容
f.seek(10, io.SEEK_SET) # 将偏移量设为,文件开头 + 10 字节
f.write('XXXXXXXX') # 在中间写入,会进行覆盖
f.close()
f = open('./1.txt', 'r')
print(f.read())
#with
每次都手动关闭文件略显繁琐,并且过程中如果发生了错误,可能导致忘记关闭。在 Python 中可以使用 with
解决这个问题:
with open('/path/to/file', 'r') as f:
pass
在 with
的代码块运行结束时,自动调用 f.__exit__()
来关闭文件,无论是正常结束,还是异常中断。
任何有
__enter__
和__exit__
方法的对象均可以使用with
语句。
在进入with
时自动调用对象的__enter__
方法,在离开with
时自动调用对象的__exit__
方法。
示例:
class Refrigerator:
def __enter__(self):
print('打开冰箱')
def __exit__(self, type, value, traceback):
print('关闭冰箱')
refrigerator = Refrigerator()
with refrigerator:
pass
#for
文件 I/O 流是一个 可迭代对象,迭代时的每次返回一行。
下面这个示例会逐行打印自身:
with open(__file__, 'r') as fp: # __line__ 是一个特殊的内置变量,表示当前 Python 文件自身的路径
for line in fp:
print(line)