简介
Python 是一个处理数据的强大工具。编程中最常见的任务之一就是读取、写入或操作数据。因此,了解如何处理存储不同类型数据的不同文件格式尤为重要。
例如,考虑一个检查用户访问控制列表的 Python 程序。你的用户列表可能存储在一个文本文件中,允许你检查访问权限或修改权限。使用 Python,能够打开、读取、写入和关闭文件将有助于处理此类任务。
本教程将简要描述 Python 能够处理的一些文件格式。在简要介绍这些文件格式之后,你将学习如何在 Python 3 中打开、读取和写入文本文件。完成后,你将能够处理 Python 中的任何纯文本文件。
先决条件
在进行本教程之前,你应该已经安装了 Python 3,并在计算机上设置了本地编程环境。如果还没有这样做,你可以按照适用于你操作系统的相应安装和设置指南进行设置:
- Ubuntu 22.04 或 Debian 8
- CentOS 7
- Mac OS X
- Windows 10
背景
Python 非常灵活,可以轻松处理多种不同的文件格式,包括但不限于以下内容:
文件类型 | 描述 |
纯文本 | 纯文本文件存储表示仅包含字符(或字符串)的数据,并排除任何结构化元数据 |
CSV | 逗号分隔值文件使用逗号(或其他分隔符)来结构化存储的数据,允许数据以表格格式保存 |
HTML | 超文本标记语言文件存储用于由浏览器显示的结构化数据,通常与网站一起使用 |
JSON | JavaScript 对象表示法是一种简单高效的格式,使其成为存储和传输结构化数据最常用的格式之一 |
本教程将重点介绍如何处理纯文本文件。
步骤 1 —— 创建文本文件
在我们开始在 Python 中工作之前,我们需要确保有一个要处理的文件。为此,请打开你的代码编辑器,并创建一个名为 days.txt
的新纯文本文件。
在新文件中,输入几行文本,列出一周的天数:
Monday Tuesday Wednesday Thursday Friday Saturday Sunday
接下来,保存你的文件,并记下其位置。在本例中,我们的用户 sammy 将文件保存在 /home/sammy/days.txt
。这在后续步骤中将非常重要,因为我们将在 Python 中打开该文件。
现在你已经有了要处理的文件,可以开始编写代码了。
步骤 2 —— 打开文件
在你的代码编辑器中,创建一个新的 Python 文件,并将其命名为 files.py
。
要在 Python 中打开一个文件,我们首先需要一种将磁盘上的文件与 Python 中的变量关联的方法。这个过程称为打开文件,而变量称为文件句柄。我们首先告诉 Python 文件的位置。文件的位置通常被称为文件路径 —— 在本例中是 /home/sammy/days.txt
。创建一个变量来存储这个路径信息。
path = '/home/sammy/days.txt'
现在,你可以使用 Python 的 open()
函数来打开我们的 days.txt
文件。open()
函数需要文件路径作为其第一个参数。该函数还接受许多其他参数。然而,最重要的是可选的 mode
参数。这是一个可选的字符串,指定打开文件的模式。你选择的模式将取决于你希望对文件进行的操作。以下是一些可用的模式:
'r'
:用于从文件中读取数据'w'
:用于向文件中写入数据'a'
:用于向文件中追加数据'r+'
:用于在同一文件中进行读取和写入
在本例中,我们只想从文件中读取数据,因此我们将使用 'r'
模式。使用 open()
函数打开 days.txt
文件,并将生成的文件句柄分配给变量 days_file
。
days_file = open(path, 'r')
现在你已经打开了文件,接下来的步骤将指导你读取其内容。
步骤 3 —— 读取文件
由于我们已经打开了文件,现在可以通过分配给它的变量来操作它(即从中读取)。Python 提供了三种相关的操作来从文件中读取信息。让我们花点时间了解一下它们各自是如何工作的。
使用 read
第一个操作 read()
返回整个文件的内容作为一个字符串。例如:
days_file.read()
结果将是:
'Monday\nTuesday\nWednesday\nThursday\nFriday\nSaturday\nSunday\n'
使用 readline
第二个操作 readline()
返回文件的下一行,包括下一个换行符在内的文本。简单来说,这个操作将逐行读取文件。
days_file.readline()
结果将是:
'Monday\n'
一旦使用 readline
操作读取了一行,文件的当前读取位置将移动到下一行。如果再次调用这个操作,它将返回文件中的下一行,如下所示:
days_file.readline()
'Tuesday\n'
使用 readlines
最后一个操作 readlines()
返回文件中每一行的列表,其中列表的每个项目代表一行。
days_file.readlines()
['Monday\n', 'Tuesday\n', 'Wednesday\n', 'Thursday\n', 'Friday\n', 'Saturday\n', 'Sunday\n']
在读取文件时需要记住的一点是,一旦使用了其中一个读取操作,就不能再次读取文件。例如,如果首先运行 days_file.read()
,然后是 days_file.readlines()
,第二个操作将返回一个空字符串。因此,每当你想要从文件中读取时,你必须首先打开一个新的文件变量或使用 seek()
方法,这超出了本教程的范围。如果你想了解更多,Python 对这些方法有很好的文档。
现在我们已经从文件中读取了内容,让我们学习如何写入新文件。
步骤 4 —— 写入文件
在这一步中,你将写入一个新文件,其中包括标题 Days of the Week,后面跟着第一个文件的内容。首先,创建一个 title
变量。
title = 'Days of the Week\n'
你还需要将一周的天数存储在一个变量中,我们将其称为 days
。这段代码以读模式打开文件,读取文件,并将读取操作返回的输出存储在我们的新变量 days
中。为了更容易理解,步骤 2 中的代码已经包含在内。
path = '/home/sammy/days.txt' days_file = open(path, 'r') days = days_file.read()
现在你有了标题和一周的天数的变量,你可以开始写入新文件。首先,指定文件的位置。同样,我们将使用目录 /home/sammy/
,所以我们的路径将是 /home/sammy/new_days.txt
。然后,你可以使用 open()
函数以写模式打开新文件,指定 'w'
模式。
new_path = '/home/sammy/new_days.txt' new_days = open(new_path, 'w')
一旦打开了新文件,你可以使用 write()
方法添加数据。这个方法接受一个字符串参数,并将该数据写入文件。如果你想在文件中开始新的一行,你必须显式提供换行符 \n
,这在你将 'Days of the Week\n'
赋给 title
变量时已经包含在内。
将标题写入文件,然后是一周的天数。可能有助于添加一些 print
语句来跟踪我们要写入文件的内容,这通常用于跟踪脚本的进度。
new_days.write(title) print(title) new_days.write(days) print(days)
最后,当你完成对文件的操作时,关闭文件是很重要的。
步骤 5 —— 关闭文件
关闭文件确保磁盘上的文件与文件句柄之间的连接已经结束。关闭文件还确保其他程序能够访问它们,并保持你的数据安全。如果你没有像 步骤 6 中描述的那样使用 with
语句,一定要确保关闭你的文件。在这个例子中,使用 close()
方法关闭所有文件。
days_file.close() new_days.close()
现在脚本完成了对文件的操作,它使用 close()
方法释放了文件句柄。
步骤 6 —— 使用 with
语句(可选)
在 Python 中处理文件的推荐方式(通常称为Pythonic方式)是使用语言的一个特性,称为 with
语句。这些语句是设置一个上下文进行工作的简写方式,一旦上下文结束,最终的细节将自动处理,以防止常见的错误。在处理文件的情况下,with
语句将自动关闭文件,这样一旦你完成任务,就不会有文件句柄残留。
与 Python 中的任何块一样,比如函数定义、if
语句或循环,with
语句采用一个简单语句后跟一个 :
,然后是一个缩进的代码块。下面是一个打开文件并打印其内容的代码示例:
with open('/home/sammy/days.txt', 'r') as days_file: days = days_file.read() print(days)
让我们逐步了解这段代码的作用。与之前一样,我们使用 Python 的内置 open()
函数打开文件,传递文件路径和模式参数。然而,由于我们使用了 with
语句,而不是使用 =
将结果的文件句柄分配给一个变量,我们使用 as
关键字进行分配。这是完整 with
语句语法的一部分:
with action as result: . . .
在 :
之后,我们移到下一行并缩进我们的代码,这是 Python 组织功能块的方式。与之前一样,我们可以在 days_file
变量中访问文件句柄,因此我们可以调用 read()
方法来获取所有内容,并将其 print()
出来。
请注意,这里没有调用 close()
方法。这是因为一旦代码离开这个块(也就是说,一旦下一行的代码不再缩进,或者文件结束了),with
语句的上下文就知道自动关闭这些文件。这样做的好处不仅在于你不需要记住每次都关闭文件,而且你处理特定文件的所有逻辑在该块内视觉上和逻辑上都是清晰的。这种结构有助于保持代码的清晰和可读性。
有了这个理解,让我们使用 with
语句重新编写我们之前的代码:
with open(path, 'r') as days_file, open(new_path, 'w') as new_days: days = days_file.read() new_days.write(title) new_days.write(days) print(title) print(days)
现在代码更加有组织。我们首先像之前一样定义了一些变量:我们两个文件的路径和我们将用于新文件标题的标题。之后,我们开始我们的 with
语句,打开我们的两个文件,并将它们的连接存储在适当命名的变量中。与之前一样,我们读取了 days_file
的内容,然后将标题和这些内容写入了 new_days
。最后,我们通过取消缩进代码块来结束该块,以打印我们读取的 title
和 days
的值。
虽然有一些情况下你会想要使用之前描述的 close()
方法,而且了解它的工作原理很重要,但在 Python 中处理文件时,你通常会使用 with
语句。
第 7 步 — 检查我们的代码
在运行代码之前,最好确保一切看起来都是正确的。最终的产品应该是这样的:
path = '/home/sammy/days.txt' new_path = '/home/sammy/new_days.txt' title = 'Days of the week\n' with open(path, 'r') as days_file, open(new_path, 'w') as new_days: days = days_file.read() new_days.write(title) new_days.write(days) print(title) print(days)
保存代码后,打开终端并运行你的 Python 脚本,就像这样:
python files.py
输出将如下所示:
Days of the Week Monday Tuesday Wednesday Thursday Friday Saturday Sunday
现在,通过打开新文件(new_days.txt
)来完全检查代码是否运行正常。如果一切顺利,它应该包含以下内容:
Days of the Week Monday Tuesday Wednesday Thursday Friday Saturday Sunday
结论
在本教程中,我们学习了如何在 Python 3 中处理和操作纯文本文件。现在你可以在 Python 中打开、读取、写入和关闭文件,并且可以继续在 Python 中处理自己的数据。Python 在处理输入和输出时提供了许多其他有用的方法,并且还提供了文档以便进一步学习。