Python文件读写操作
Synopsis: Python中可以使用open()方法来打开一个文件描述符,并指定相应的访问模式,来决定是读取文件还是写入文件。读写完成后,切记要调用close()方法来关闭文件描述符。Python中不仅可以保存数据到磁盘上的文件中,还可以在内存中读写数据,比如StringIO和BytesIO这种file-like object
1. 文件的打开与关闭
现代操作系统不允许应用程序直接操作磁盘,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
Python中的文件读写分为三个步骤:
- 打开
文件描述符(r/w/a模式),或者新建文件描述符(x模式) - 读写数据(
read()或write()) - 关闭
文件描述符(close())
Python内置了open()函数可以打开一个已经存在的文件,或者创建一个新文件。我们只需要传入文件名和访问模式,返回一个文件对象:
Help on built-in function open in module io: open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) Open file and return a stream. Raise IOError upon failure.
如果不指定mode(打开文件的方式),则默认是r,表示只能读取此文件对象中的内容。r模式强调此文件必须已存在,否则会报错FileNotFoundError;x模式强调此文件必须不能已存在,否则会报错FileExistsError
| Mode Character | Meaning | 说明 |
|---|---|---|
r |
open for reading (default) | 只能读取(文件必须已存在),如果文件不存在,则报错FileNotFoundError |
w |
open for writing, truncating the file first | 只能写入,如果文件已存在,则先清空原内容再写入(全覆盖);如果文件不存在,则创建新文件并写入 |
x |
create a new file and open it for writing | 只能创建新文件并写入(不能读取),如果文件已存在,则报错FileExistsError |
a |
open for writing, appending to the end of the file if it exists | 只能追加(不能读取),如果文件已存在,则在文件末尾追加内容(一开始文件指针位于文件末尾,就算使用seek(0, 0)定位到文件开头,此时调用write()还是会写入到文件末尾);如果文件不存在,则创建新文件并写入 |
b |
binary mode | 以二进制格式打开一个文件,比如图片、视频等(此模式下读取或写入文件对象的是bytes) |
t |
text mode (default) | 以文本格式打开一个文件,比如文本文件(此模式下读取或写入文件对象的是str)。它是默认的,所以r/w/x/a分别相当于rt/wt/xt/at |
+ |
open a disk file for updating (reading and writing) | 与r/w/x/a组合使用,可同时读写文件 |
常用的组合访问模式:
rb: 以二进制格式打开一个文件用于只读(此文件必须已存在),文件指针位于文件的开头wb: 以二进制格式打开一个文件用于写入,如果该文件已存在,则先清空原内容再写入(全覆盖);如果该文件不存在,则创建新文件并写入ab: 以二进制格式打开一个文件用于追加,如果该文件已存在,则在文件末尾追加内容(就算使用seek(0, 0)定位到文件开头,此时调用write()还是会写入到文件末尾);如果该文件不存在,则创建新文件并写入r+: 打开一个文件用于读写(文件必须已存在),如果文件不存在,则报错FileNotFoundErrorw+: 打开一个文件用于读写,如果文件已存在,则先清空原内容再写入(全覆盖);如果文件不存在,则创建新文件并写入x+:创建一个文件用于读写(文件不能已存在),如果文件已存在,则报错FileExistsErrora+: 打开一个文件用于读写,如果文件已存在,则在文件末尾追加内容(就算使用seek(0, 0)定位到文件开头,此时调用write()还是会写入到文件末尾);如果文件不存在,则创建新文件并写入rb+/wb+/ab+: 不再复述,也是可同时读写
2. read
2.1 读取文本文件 str
可以指定mode为r,也可以省略。文件名可以是绝对路径或相对路径,相对路径表示当前目录的文件。如果文件不存在,将抛出FileNotFoundError异常:
In [1]: f = open('/tmp/test.txt') --------------------------------------------------------------------------- FileNotFoundError Traceback (most recent call last) <ipython-input-1-328051eff72d> in <module>() ----> 1 f = open('/tmp/test.txt') FileNotFoundError: [Errno 2] No such file or directory: '/tmp/test.txt'
如果成功打开文件,可以使用read()方法一次性读取所有内容到内存中,返回str对象。tell()方法返回当前文件指针的位置(从0开始计数),seek(offset, from)重新设置文件指针的位置,其中offset表示偏移量,正数表示往后偏移多少个字节,负数表示往前偏移多少个字节,from表示从哪开始偏移(0:文件开头,1:当前指针位置,2:文件末尾),所以seek(0, 0)表示回到文件开头处,seek(3, 1)表示从当前位置向后偏移3个字节,seek(-3, 2)表示文件末尾倒数第3个字节处
In [2]: f = open('/tmp/test.txt') In [3]: f.read() Out[3]: 'aaa\nbbb\nccc\n' In [4]: f.read() # 此时文件指针已到文件末尾,所以再次调用read()返回空 Out[4]: '' In [5]: f.tell() Out[5]: 12 In [6]: f.seek(0, 0) Out[6]: 0 In [7]: f.tell() Out[7]: 0 In [8]: f.read() Out[8]: 'aaa\nbbb\nccc\n' In [9]: f.seek(0, 0) Out[9]: 0 In [10]: s = f.read() In [11]: s Out[11]: 'aaa\nbbb\nccc\n' In [12]: type(s) # open()方法默认以t模式即文本模式打开文件对象,读取或写入的数据是str类型(Unicode) Out[12]: str In [13]: f.close()
切记: 一旦读写完文件,要记得
f.close()关闭文件,因为文件对象会占用操作系统的资源,所以一般操作系统设置可打开的最大文件描述符数量
但是文件读写时可能会产生IO错误,那么后面f.close()可能不会被调用,所以要使用try...finally或with语句:
0 条评论
评论者的用户名
评论时间暂时还没有评论.