编辑这个页面须要登录或更高权限!

Python 文件I/O

什么是文件?

文件是磁盘上用于存储相关信息的命名位置。它用于将数据永久存储在非易失性存储器(例如硬盘)中。

由于随机存取存储器(RAM)易失,当计算机关闭时会丢失其数据,因此我们将文件用于将来的数据使用。

当我们要读取或写入文件时,我们需要先打开它。完成后,需要将其关闭,以便释放与文件绑定的资源。

因此,在Python中,文件操作按以下顺序进行。

  1. 打开文件

  2. 读取或写入(执行操作)

  3. 关闭文件

如何打开文件?

Python具有内置函数open()来打开文件。此函数返回文件对象,也称为句柄,因为它用于相应地读取或修改文件。

>>> f = open("test.txt")    # 打开当前目录中的文件
>>> f = open("C:/Python33/README.txt")  # 指定完整路径

我们可以在打开文件时指定模式。在模式下,我们指定是要读取'r',写入'w'还是追加'a'到文件。我们还指定是否要以文本模式或二进制模式打开文件。

默认设置是在文本模式下阅读。在这种模式下,当从文件中读取时,我们会得到字符串。

另一方面,二进制模式返回字节,这是处理非文本文件(如图像或exe文件)时要使用的模式。

Python文件模式
模式描述
'r'打开文件进行读取。(默认)
'w'打开文件进行写入。如果不存在则创建一个新文件,或者如果存在则将其截断。
'x'打开文件以进行独占创建。如果文件已经存在,则操作失败。
'a'打开以在文件末尾追加而不截断。如果不存在,则创建一个新文件。
't'以文本模式打开。(默认)
'b'以二进制模式打开。
'+'打开文件进行更新(读取和写入)
f = open("test.txt")      # 等同于“ r”或“ rt”
f = open("test.txt",'w')  # 文本模式写入
f = open("img.bmp",'r+b') # 以二进制模式读取和写入

与其他语言不同,该字符'a'在使用ASCII(或其他等效编码)进行编码之前不会暗示数字97 。

此外,默认编码取决于平台。在Windows中,'cp1252'但是'utf-8'在Linux中。

因此,我们也不能依赖默认编码,否则我们的代码在不同平台上的行为会有所不同。

因此,在以文本模式处理文件时,强烈建议指定编码类型。

f = open("test.txt",mode = 'r',encoding = 'utf-8')

如何使用Python关闭文件?

完成对文件的操作后,我们需要正确关闭文件。

关闭文件将释放与该文件绑定的资源,并且使用close()方法完成  。

Python有一个垃圾收集器来清理未引用的对象,但是,我们绝对不能依靠它来关闭文件。

f = open("test.txt",encoding = 'utf-8')
# 执行文件操作
f.close()

这种方法并不完全安全。如果对文件执行某些操作时发生异常,则代码将退出而不关闭文件。

一种更安全的方法是使用try ... finally块。

try:
   f = open("test.txt",encoding = 'utf-8')
   # 执行文件操作
finally:
   f.close()

这样,我们可以保证即使引发异常也可以正确关闭文件,从而导致程序流停止。

最好的方法是使用with语句。这样可以确保在with退出内部块时关闭文件。

我们不需要显式调用该close()方法。它是在内部完成的。

with open("test.txt",encoding = 'utf-8') as f:
   # 执行文件操作

如何使用Python写入文件?

为了用Python写入文件,我们可以以 'w' 模式写入,'a'模式追加或独占创建'x'模式打开它。

我们需要谨慎使用该'w'模式,因为它会覆盖文件(如果已存在)。以前的所有数据都将被删除。

写入字符串或字节序列(对于二进制文件)是使用write()方法完成的。此方法返回写入文件的字符数。

with open("test.txt",'w',encoding = 'utf-8') as f:
   f.write("my first file\n")
   f.write("This file\n\n")
   f.write("contains three lines\n")

'test.txt'如果不存在,该程序将创建一个名为的新文件。如果确实存在,则将其覆盖。

我们必须自己包括换行符,以区分不同的行。

如何在Python中读取文件?

要使用Python读取文件,我们必须以读取模式打开文件。

有多种方法可用于此目的。我们可以使用该read(size)方法读取大小数据。如果未指定size参数,它将读取并返回到文件末尾。

>>> f = open("test.txt",'r',encoding = 'utf-8')
>>> f.read(4)    # 读取前4个数据
'This'

>>> f.read(4)    # 读取接下来的4个数据
' is '

>>> f.read()     # 读取其余部分,直到文件末尾
'my first file\nThis file\ncontains three lines\n'

>>> f.read()  # 进一步读取返回空字符串
''

我们可以看到,read()方法将换行符返回为'\n'。到达文件末尾后,我们将在进一步阅读时得到空字符串。

我们可以使用seek()方法更改当前文件的光标(位置)。同样,tell()方法返回我们的当前位置(以字节数为单位)。

>>> f.tell()    # 获取当前文件位置
56

>>> f.seek(0)   # 将文件光标移到初始位置
0

>>> print(f.read())  # 读取整个文件
This is my first file
This file
contains three lines

我们可以使用for循环逐行读取文件。这既高效又快速。

>>> for line in f:
...     print(line, end = '')
...
This is my first file
This file
contains three lines

文件本身的行具有换行符'\n'。

此外,print()结束参数在打印时避免了两行换行。

或者,我们可以使用readline()方法读取文件的各个行。此方法读取文件,直到换行符为止,包括换行符。

>>> f.readline()
'This is my first file\n'

>>> f.readline()
'This file\n'

>>> f.readline()
'contains three lines\n'

>>> f.readline()
''

最后,该readlines()方法返回整个文件的其余行的列表。当到达文件结尾(EOF)时,所有这些读取方法都将返回空值。

>>> f.readlines()
['This is my first file\n', 'This file\n', 'contains three lines\n']

Python文件方法

文件对象有多种可用方法。其中一些已在以上示例中使用。

这是文本模式下方法的完整列表,并带有简要说明。

Python文件方法
close()关闭文件。
detach()从缓冲区返回分离的原始流(raw stream)。
fileno()从操作系统的角度返回表示流的数字。
flush()刷新内部缓冲区。
isatty()返回文件流是否是交互式的。
read()返回文件内容。
readable()返回是否能够读取文件流。
readline()返回文件中的一行。
readlines()返回文件中的行列表。
seek()更改文件位置。
seekable()返回文件是否允许我们更改文件位置。
tell()返回当前的文件位置。
truncate()把文件调整为指定的大小。
writeable()返回是否能够写入文件。
write()把指定的字符串写入文件。
writelines()把字符串列表写入文件。

Python 基础教程
Python 流程控制
Python 函数
Python 数据类型
Python 文件操作
Python 对象和类
Python 日期和时间
Python 高级知识
Python 参考手册