文件 I/O(输入/输出)是指在程序中与文件进行交互的操作。在 Python 中,可以使用内置的 open() 函数来打开文件,并使用文件对象的方法来进行读写操作。文件 I/O 是处理数据存储和读取的常见方式,尤其在需要持久化数据时非常有用。


1. 引言

文件 I/O 是 Python 中非常基础且重要的一部分。通过文件 I/O,我们可以读取文件中的数据,将数据写入文件,或者以二进制格式进行文件操作。Python 提供了多种方法来操作文件,并具有自动管理文件资源的功能。


2. 打开文件

2.1 使用 open() 函数

在 Python 中,使用 open() 函数来打开文件。该函数的基本语法如下:

file = open(filename, mode)

  • filename:文件名或文件路径。
  • mode:文件打开模式,指定文件的操作方式(读取、写入、追加等)。

2.2 文件打开模式

  • 'r':只读模式(默认模式)。如果文件不存在,会抛出 FileNotFoundError
  • 'w':写入模式。如果文件存在,文件会被覆盖;如果文件不存在,会创建一个新文件。
  • 'a':追加模式。如果文件不存在,会创建一个新文件;如果文件存在,数据会被添加到文件末尾。
  • 'b':二进制模式,用于处理二进制文件(如图片、音频等)。
  • 'x':排它性创建文件模式。如果文件已存在,则抛出 FileExistsError
  • 't':文本模式(默认模式)。

示例:打开文件并读取内容

file = open("example.txt", "r")
content = file.read()
print(content)
file.close()


3. 文件读取

Python 提供了多种方式来读取文件的内容。

3.1 read() 方法

read() 方法一次性读取文件中的所有内容,返回一个字符串。

file = open("example.txt", "r")
content = file.read()  # 读取文件的所有内容
print(content)
file.close()

3.2 readline() 方法

readline() 方法读取文件中的一行内容,返回一个字符串。可以多次调用 readline() 来逐行读取文件。

file = open("example.txt", "r")
line = file.readline()  # 读取第一行
print(line)
file.close()

3.3 readlines() 方法

readlines() 方法读取文件中的所有行,并将每行作为一个元素存入列表中。

file = open("example.txt", "r")
lines = file.readlines()  # 读取所有行,返回一个列表
print(lines)
file.close()


4. 文件写入

在 Python 中,可以使用 write()writelines() 方法将数据写入文件。

4.1 write() 方法

write() 方法将字符串写入文件。如果文件已经存在,内容会被覆盖。

file = open("example.txt", "w")
file.write("Hello, world!")  # 写入内容
file.close()

4.2 writelines() 方法

writelines() 方法接受一个列表,将列表中的每个元素写入文件。每个元素必须是一个字符串。

lines = ["Hello, world!\n", "Welcome to Python!\n"]
file = open("example.txt", "w")
file.writelines(lines)  # 写入多行内容
file.close()


5. 文件操作的上下文管理

为了确保文件在操作完成后被正确关闭,推荐使用 with 语句,它会自动处理文件的打开和关闭。

示例:使用 with 语句打开文件

with open("example.txt", "r") as file:
    content = file.read()
    print(content)
# 文件在退出 `with` 语句后自动关闭

使用 with 语句,可以避免忘记关闭文件带来的潜在问题。


6. 文件的二进制操作

当处理二进制文件(如图片、音频文件等)时,需要以二进制模式打开文件,通常使用 'rb''wb' 模式。

示例:读取二进制文件

with open("image.jpg", "rb") as file:
    content = file.read()  # 读取二进制文件内容
    print(content)

示例:写入二进制文件

data = b'\x89PNG\r\n\x1a\n'  # 示例二进制数据
with open("output.png", "wb") as file:
    file.write(data)  # 写入二进制数据


7. 文件的定位与移动

可以使用 seek() 方法来定位文件指针的位置,tell() 方法来获取当前文件指针的位置。

7.1 seek() 方法

seek(offset, whence):移动文件指针到指定位置。

  • offset:相对于 whence 的偏移量,单位是字节。
  • whence:可选的起始位置(默认为 os.SEEK_SET):
    • os.SEEK_SET:文件开头
    • os.SEEK_CUR:当前位置
    • os.SEEK_END:文件末尾
with open("example.txt", "r") as file:
    file.seek(5)  # 从文件开头偏移 5 字节
    content = file.read()
    print(content)

7.2 tell() 方法

tell() 返回当前文件指针的位置。

with open("example.txt", "r") as file:
    file.seek(5)
    print(file.tell())  # 输出当前指针位置


8. 关闭文件

虽然使用 with 语句时文件会自动关闭,但如果没有使用 with,则需要显式调用 close() 方法来关闭文件。

file = open("example.txt", "r")
content = file.read()
file.close()  # 显式关闭文件


9. 异常处理

在进行文件操作时,可能会遇到各种异常情况,例如文件不存在、权限不足等。可以使用 try...except 语句来捕获异常并处理。

示例:捕获文件打开异常

try:
    file = open("nonexistent.txt", "r")
except FileNotFoundError:
    print("文件未找到!")


10. 结论

文件 I/O 是 Python 中常见且强大的功能,可以帮助开发者处理各种类型的文件。通过合理使用文件的读写操作和上下文管理,可以有效地提高代码的可读性和可靠性。Python 提供了多种方法和模式来满足不同的文件操作需求,例如二进制文件的处理、定位文件指针以及处理文件打开错误等。


参考资料:

  1. Python 官方文档 – 文件和输入/输出
  2. Python 官方文档 – 文件对象