Python 文件读写

PythonBeginner
立即练习

介绍

在这个 Lab 中,你将学习在 Python 中进行文件读写的基础流程。文件 I/O(输入/输出)是任何程序员的一项关键技能,因为它允许你的程序持久化数据、读取配置以及与文件系统进行交互。

我们将重点关注使用 with 语句,这是 Python 中处理文件的现代且推荐的方式。它确保即使发生错误,文件也会被自动关闭,从而防止资源泄漏。

在整个 Lab 过程中,你将:

  • 理解基本的文件 I/O 流程。
  • 使用不同的方法(read()、readlines() 和迭代)打开和读取文件。
  • 将新内容写入文件以及向现有文件追加内容。

所有操作都将在 LabEx WebIDE 中进行。让我们开始吧。

文件读写过程

在这一步,你将学习 Python 中文件 I/O 的基本过程,以及为什么 with 语句至关重要。

要在 Python 中读取或写入文件,你通常遵循三个步骤:

  1. 打开文件。
  2. 从文件读取或向文件写入。
  3. 关闭文件。

手动管理文件的关闭容易出错。如果你的程序在文件打开时遇到错误,它可能无法正确关闭。为了解决这个问题,Python 提供了 with 语句。它会自动为你处理文件的关闭,即使发生异常,也能确保系统资源得到正确管理。

注意: 如果你不熟悉使用 WebIDE(类似 VS Code),请先在 这个实验 学习。

基本语法如下:

with open('filename.txt', 'mode') as file_variable:
    ## 在文件上执行操作
  • open(): 用于打开文件的内置函数。
  • 'filename.txt': 文件的路径。
  • 'mode': 一个字符,指示文件将如何被使用(例如,'r' 表示读取,'w' 表示写入)。
  • file_variable: 你将用来与文件对象交互的变量。

这一步纯粹是概念性的。在接下来的步骤中,你将应用这些知识来执行实际的文件操作。

打开和读取文件

在这一步中,你将学习如何使用 open() 函数打开和读取文件。我们将介绍读取整个文件、将文件逐行读入列表,以及迭代行(对于大文件来说非常高效)的方法。

设置脚本已经为你创建了两个文件:hi.txt 和 sonnet29.txt。

使用 read() 读取整个文件

read() 方法将文件的全部内容读取到一个单独的字符串中。

  1. 在左侧的文件浏览器中,打开 read_file.py 文件。
  2. 向其中添加以下代码。此脚本打开 hi.txt,读取其内容,并将其打印到控制台。
## 使用 'with' 语句读取文件:完成后自动关闭文件
with open('/home/labex/project/hi.txt') as hello_file:
    hello_content = hello_file.read()  ## 读取整个文件内容

print(hello_content)
  1. 要运行脚本,打开终端并执行以下命令:
python3 read_file.py

你应该会看到 hi.txt 的内容被打印出来。

Hello World!

使用 readlines() 将文件读入行列表

readlines() 方法读取文件的所有行,并将它们作为字符串列表返回。列表中的每个字符串代表一行,并且末尾包含换行符 \n。

  1. 使用以下代码修改 read_file.py 以读取 sonnet29.txt。
## readlines() 方法:返回一个字符串列表,每行一个
with open('/home/labex/project/sonnet29.txt') as sonnet_file:
    lines = sonnet_file.readlines()  ## 返回一个列表,其中每个元素都是一个字符串行

print(lines)
  1. 再次运行脚本:
python3 read_file.py

输出将是一个字符串列表,其中每个字符串是文件中的一行。

['When, in disgrace with fortune and men\'s eyes,\n', 'I all alone beweep my outcast state,\n', 'And trouble deaf heaven with my bootless cries,\n', 'And look upon myself and curse my fate,\n']

逐行迭代文件

对于大文件,将全部内容读入内存可能效率不高。更好的方法是直接迭代文件对象。这会逐行读取文件,而无需将整个文件加载到内存中。

  1. 最后一次使用以下代码修改 read_file.py。
## 逐行迭代文件(对大文件来说内存效率高)
with open('/home/labex/project/sonnet29.txt') as sonnet_file:
    for line in sonnet_file:  ## 文件对象是可迭代的
        print(line, end='')  ## 打印时不添加额外的换行符

注意:我们在 print() 函数中使用 end='' 是为了防止添加额外的换行符,因为文件中的每一行已经以换行符结尾。

  1. 运行脚本:
python3 read_file.py

这将完美格式化地打印文件的内容。

When, in disgrace with fortune and men's eyes,
I all alone beweep my outcast state,
And trouble deaf heaven with my bootless cries,
And look upon myself and curse my fate,

写入文件

在这一步中,你将探索如何将数据写入文件。我们将介绍两种不同的模式:写入模式 ('w'),它会覆盖任何现有内容;以及追加模式 ('a'),它会将新数据添加到文件末尾。

使用 'w' 模式写入文件

当你以写入模式 ('w') 打开文件时,如果文件不存在,则会创建一个新文件。如果文件已存在,其全部内容将在写入新内容之前被清除。

  1. 在文件浏览器中,打开 write_file.py 文件。
  2. 添加以下代码。此脚本将创建一个名为 bacon.txt 的文件,并向其中写入一行文本。write() 方法返回写入的字符数。
## 写入文件:'w' 模式会覆盖现有文件
with open('/home/labex/project/bacon.txt', 'w') as bacon_file:  ## 'w' = 写入模式
    chars_written = bacon_file.write('Hello world!\n')  ## 返回写入的字符数

print(chars_written)
  1. 从终端运行脚本:
python3 write_file.py

输出显示写入文件的字符数。

13

你现在可以在文件浏览器中看到一个新文件 bacon.txt。

使用 'a' 模式向文件追加内容

追加模式 ('a') 用于在不删除现有内容的情况下向文件末尾添加数据。如果文件不存在,它将被创建。

  1. 修改 write_file.py 以向 bacon.txt 追加另一行。
## 向文件追加内容:'a' 模式会在现有文件末尾追加
with open('/home/labex/project/bacon.txt', 'a') as bacon_file:  ## 'a' = 追加模式
    chars_written = bacon_file.write('Bacon is not a vegetable.')

print(chars_written)
  1. 再次运行脚本:
python3 write_file.py

输出显示新字符串的字符数。

25

验证最终内容

为了确认写入和追加操作都正确执行,我们来读取 bacon.txt 的内容。

  1. 最后一次修改 write_file.py 以读取并打印 bacon.txt 的内容。
with open('/home/labex/project/bacon.txt') as bacon_file:
    content = bacon_file.read()

print(content)
  1. 运行脚本:
python3 write_file.py

输出应显示来自写入和追加操作的合并内容。

Hello world!
Bacon is not a vegetable.

总结

恭喜你完成了关于 Python 中文件读写的这个实验!

在这个实验中,你学习了文件 I/O 的基本技能。你首先了解了使用 with 语句进行安全和自动文件处理的重要性。

然后,你练习了几种读取文件的方法:

  • 使用 read() 将全部内容作为单个字符串获取。
  • 使用 readlines() 获取所有行的列表。
  • 直接迭代文件对象,这是一种内存高效的方式,可以逐行处理大文件。

最后,你探索了如何写入文件:

  • 使用写入模式 ('w') 来创建新文件或覆盖现有文件。
  • 使用追加模式 ('a') 在不擦除先前数据的情况下向文件末尾添加内容。

这些基本操作是需要存储数据、读取配置或处理文本文件的更复杂应用程序的构建块。