Python文件读写操作

  • 原创
  • Madman
  • /
  • /
  • 0
  • 1618 次阅读

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模式强调此文件必须已存在,否则会报错FileNotFoundErrorx模式强调此文件必须不能已存在,否则会报错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...finallywith语句:

# 1. 繁琐的try...finally
try:
    f = open('/tmp/test.txt', 'r'
                                
                            
  • Leuan12
  • NikolaiOJ
  • 小神龙
  • x00miya
  • 984641739wang
  • ns
  • hyh8754
  • YLcharmyl
  • dudulangaaa
  • 王松
  • jojo
  • Andy_ck
未经允许不得转载: LIFE & SHARE - 王颜公子 » Python文件读写操作

分享

作者

作者头像

Madman

如需 Linux / Python 相关问题付费解答,请按如下方式联系我

0 条评论

暂时还没有评论.