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+
: 打开一个文件用于读写
(文件必须已存在),如果文件不存在,则报错FileNotFoundError
w+
: 打开一个文件用于读写
,如果文件已存在,则先清空原内容再写入(全覆盖);如果文件不存在,则创建新文件并写入x+
:创建
一个文件用于读写
(文件不能已存在),如果文件已存在,则报错FileExistsError
a+
: 打开一个文件用于读写
,如果文件已存在,则在文件末尾
追加内容(就算使用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 条评论
评论者的用户名
评论时间暂时还没有评论.