Python 基础教程

Python 流程控制

Python 函数

Python 数据类型

Python 文件操作

Python 对象和类

Python 日期和时间

Python 高级知识

Python 参考手册

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()把字符串列表写入文件。