有时我们需要把数据永久存储起来,随时使用随时读取。例如,我们通过程序建立的列表、字典等数据,当程序结束时,需要把这些数据存储到文件中,当程序再次启动时,可以把这些数据读入到程序中,避免这些数据的重新录入。
在Python语言中,负责文件操作的称为文件对象,文件对象不仅可以访问存储在磁盘中的文件,也可以访问网络文件。文件对象通过open函数得到,获取文件对象后,就可以使用文件对象提供的方法来读写文件。
但open函数在处理某些问题是并不是很理想,有没有其他比open函数更加适合读取某些特定文件呢?下面我们就一起来看看!
回顾open函数
对文件操作使用最频繁对函数,open()
打开一个文件对象,使用Python内置的open()函数
,传入文件名和模式
。
file_object = open(name [, mode][, buffering])
name
: 要读取的文件名称。
mode
: 打开文件的模式,选填。r, r+, w, w+, a, a+
使用最多。
buffering
: 文件所需的缓冲区大小, 选填。0表示无缓冲, 1表示线路缓冲。有四种打开文件的不同方法(模式)
"r"
- 读取 - 默认值。打开文件进行读取,如果文件不存在则报错。
"a"
- 追加 - 打开供追加的文件,如果不存在则创建该文件。
"w"
- 写入 - 打开文件进行写入,如果文件不存在则创建该文件。
"x"
- 创建 - 创建指定的文件,如果文件存在则返回错误。此外,可以指定文件是应该作为二进制还是文本模式进行处理。
"t"
- 文本 - 默认值。文本模式。
"b"
- 二进制 - 二进制模式(例如图像)。
使用时常通过with open()
方法读写文件。
with open("文件名.txt", "r") as fin: # fin为 别名(文件句柄对象)
file = fin.read() # 会一次性读取文件的全部内容
file_line = fin.readline() # 可以每次读取一行内容
file_lines = fin.readlines() # 一次读取所有内容并按行返回list
pathlib
以前在Python中操作文件路径,更多的时候是使用os模块。Python3的系统标准库pathlib
模块的Path
对路径的操作会更简单。
pathlib
的一些基本操作,如文件名操作、路径操作、文件操作等等并不在本文讨论范围。本此介绍使用率非常高的文件操作,其文件读写方法。
Path.open
在pathlib
里如果要打开一个文件十分的简单。
Path.open(mode='r',
buffering=-1,
encoding=None,
errors=None,
newline=None)
打开路径指向的文件,就像内置的open()函数
所做的一样。
from pathlib2 import Path
example_path = Path('./info.csv')
with example_path.open() as f:
print(f.readline())
print(f.read())
结果
"编号","性别","年龄","成绩"
961067,"男",23,97
969157,"男",38,98
969237,"男",27,120
970394,"男",27,118
Path读与写
对于简单的文件读写,在pathlib
模块中有几个简便的方法:
Path.read_text()
: 以字符串形式返回路径指向的文件的解码后文本内容。
Path.read_bytes()
: 以二进制/字节模式打开路径并以字节串的形式返回内容。
Path.write_text()
: 打开路径并向其写入字符串数据。
Path.write_bytes()
: 以二进制/字节模式打开路径并向其写入数据。
>>> p = Path('my_binary_file')
>>> p.write_bytes(b'Binary file contents')
20
>>> p.read_bytes()
b'Binary file contents'
>>> p = Path('my_text_file')
>>> p.write_text('Text file contents')
18
>>> p.read_text()
'Text file contents'
更多详情可参见pathlib模块[1]。
fileinput
如果你只想读取一个文件,使用open()
。如果需要实现文件列表的批量循环操作,不妨使用本模块。
fileinput.input
input
是fileinput
模块的初始接口,其使用也是较简单。
fileinput.input(files=None,
inplace=False,
backup='',
*,
mode='r',
openhook=None)
files
需要读取的文件对象,可迭代对象。
inplace
标准输出重定向替换,表示是否将标准输出的结果写回文件,默认不取代。
backup
读取时同时备份文件,可以指定备份的后缀名,比如backup='.bak'
。
mode
文件读取模式,fileinput 有且仅有这两种读取模式r
和rb
。
默认使用
mode='r'
如果文件是二进制的,可以使用
mode='rb'
模式。
openhook
支持用户传入自定义的对象读取方法。fileinput 内置了两个勾子函数:
fileinput.hook_encoded(encoding, errors=None