摘要:在本教程中,你将学习在 Python 中读取文本文件的各种方法。
省流速览
以下展示了如何将 readme.txt
文件中的所有文本读取到一个字符串中:
with open('readme.txt') as f:
lines = f.readlines()
在 Python 中读取文本文件的步骤
要在 Python 中读取文本文件,请按照以下步骤操作:
首先,使用
open()
函数打开一个文本文件以进行读取。其次,使用文件对象的
read()readline()
或readlines()
方法从文本文件中读取文本。最后,使用文件对象的
close()
方法关闭文件。
1)open()
函数
open()
函数有许多参数,但你只需关注前两个:
open(path_to_file, mode)
path_to_file
参数指定文本文件的路径。
如果程序和文件位于同一文件夹中,则只需指定文件的文件名。否则,需要包含文件的路径以及文件名。
要指定文件的路径,即使是在 Windows 上工作,也应使用正斜杠(/
)。
例如,如果文件 readme.txt
存储在与程序相同的 sample
文件夹中,则需要将文件路径指定为 c:/sample/readme.txt
。
mode
是一个可选参数。它是一个字符串,用于指定要以何种模式打开文件。下表显示了打开文本文件时可用的模式:
例如,要打开一个名为 the-zen-of-python.txt
的文件,该文件与程序存储在同一文件夹中,你可以使用以下代码:
f = open('the-zen-of-python.txt', 'r')
open()
函数返回一个文件对象,你将使用该文件对象从文本文件中读取文本。
2)读取文本的方法
文件对象为你提供了三种从文本文件中读取文本的方法:
read(size)
– 根据可选的size
参数读取文件的部分内容,并将内容作为字符串返回。如果省略size
,read()
方法将从上次读取的位置继续读取,直到文件末尾。如果到达文件末尾read()
方法将返回一个空字符串。readline()
– 从文本文件中读取一行,并将该行作为字符串返回。如果到达文件末尾readline()
将返回一个空字符串。readlines()
– 将文本文件的所有行读取到一个字符串列表中。如果你有一个小文件,并且想要操作该文件的整个文本,这个方法非常有用。
3) close()
方法
你打开的文件将保持打开状态,直到你使用 close()
方法关闭它。
关闭不再使用的文件非常重要,原因如下:
首先,当你在脚本中打开一个文件时,文件系统通常会将其锁定,以便在你关闭它之前,其他程序或脚本无法使用它。
其次,你的文件系统具有有限数量的文件描述符,在耗尽这些描述符之前,你可以创建的文件数量是有限的。尽管这个数量可能很高,但打开大量文件可能会耗尽你的文件系统资源。
第三,保留许多打开的文件可能会导致竞争条件,这种情况发生在多个进程尝试同时修改一个文件时,并可能导致各种意外行为。
以下展示了如何调用 close()
方法来关闭文件:
f.close()
要自动关闭文件而无需调用 close()
方法,你可以使用 with
语句,如下所示:
with open(path_to_file) as f:
contents = f.readlines()
在实际操作中,你会使用 with
语句来自动关闭文件。
读取文本文件示例
我们将使用 the-zen-of-python.txt
文件进行演示。
以下示例说明了如何使用 read()
方法将 the-zen-of-python.txt
文件的所有内容读取到一个字符串中:
with open('the-zen-of-python.txt') as f:
contents = f.read()
print(contents)
输出:
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
...
以下示例使用 readlines()
方法读取文本文件,并将文件内容作为字符串列表返回:
with open('the-zen-of-python.txt') as f:
[print(line) for line in f.readlines()]
输出:
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
...
你从文件中看到的每一行后面的空行是因为文本文件中的每一行都有一个换行符(\n
)。要去除空行,你可以使用 strip()
方法。例如:
with open('the-zen-of-python.txt') as f:
[print(line.strip()) for line in f.readlines()]
以下示例展示了如何使用 readline()
方法逐行读取文本文件:
with open('the-zen-of-python.txt') as f:
while True:
line = f.readline()
if not line:
break
print(line.strip())
输出:
Explicit is better than implicit.
Complex is better than complicated.
Flat is better than nested.
...
一种更简洁的逐行读取文本文件的方法
open()
函数返回一个文件对象,该对象是一个可迭代对象。因此,你可以使用 for
循环来迭代遍历文本文件的每一行,如下所示:
with open('the-zen-of-python.txt') as f:
for line in f:
print(line.strip())
这是一种更简洁的逐行读取文本文件的方法。
读取 UTF-8 文本文件
前面的示例代码对于 ASCII 文本文件来说工作正常。然而,如果你处理的是其他语言(如日语、中文和韩语)的文本文件,那么该文本文件就不是简单的 ASCII 文本文件了。它很可能是一个 UTF-8 文件,其中使用了不仅仅是标准 ASCII 文本字符的字符。
要打开一个 UTF-8 文本文件,你需要将 encoding='utf-8'
传递给 open()
函数,以指示它期望从文件中读取 UTF-8 字符。
为了进行演示,你将使用以下包含一些日语引文的 quotes.txt
文件。
以下展示了如何遍历 quotes.txt
文件:
with open('quotes.txt', encoding='utf8') as f:
for line in f:
print(line.strip())
输出:
总结
使用带有
'r'
模式的open()
函数以只读方式打开文本文件。使用
read()
、readline()
或readlines()
方法读取文本文件。完成文件读取后,始终使用
close()
方法或with
语句关闭文件。使用
encoding='utf-8'
来读取 UTF-8 格式的文本文件。