Python文件读写:掌握文本、CSV、JSON及二进制数据处理技巧231


作为一名专业的程序员,高效地处理文件 I/O 是日常工作中不可或缺的技能。Python 以其简洁、强大的语法,为文件读写提供了极其便利的接口。无论是处理简单的文本文件、结构化的数据如 CSV 和 JSON,还是序列化 Python 对象到二进制文件,Python 都能轻松应对。本文将深入探讨 Python 文件读写的各种格式和技巧,帮助您全面掌握这一核心能力。

1. Python 文件操作基础

在 Python 中,文件操作的核心是内置的 `open()` 函数。它返回一个文件对象,通过该对象可以进行读写操作。理解 `open()` 函数的参数至关重要。open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

其中,最重要的两个参数是 `file` (文件路径) 和 `mode` (文件打开模式)。

1.1 文件打开模式 (Mode)



`'r'` (read):只读模式。文件指针位于文件开头。如果文件不存在,则会抛出 `FileNotFoundError`。这是默认模式。
`'w'` (write):只写模式。如果文件不存在,则创建新文件;如果文件已存在,则截断文件(清空内容)并从开头写入。
`'a'` (append):追加模式。如果文件不存在,则创建新文件;如果文件已存在,则文件指针位于文件末尾,新内容会追加到现有内容之后。
`'x'` (exclusive creation):独占创建模式。如果文件已存在,则会抛出 `FileExistsError`。用于确保创建的是一个新文件。
`'b'` (binary):二进制模式。与 `r`, `w`, `a` 等结合使用,例如 `'rb'`, `'wb'`。处理非文本文件(如图片、音频、序列化对象)。
`'t'` (text):文本模式。与 `r`, `w`, `a` 等结合使用,例如 `'rt'`, `'wt'`。这是默认模式,处理文本文件时不需要显式指定。
`'+'` (update):更新模式。与 `r`, `w`, `a` 等结合使用,例如 `'r+'` (读写,文件必须存在), `'w+'` (读写,截断文件或创建), `'a+'` (读写,追加)。

1.2 文件编码 (Encoding)


在处理文本文件时,`encoding` 参数是避免乱码的关键。强烈建议显式指定编码,通常使用 `'utf-8'`,因为它支持全球几乎所有字符。

1.3 最佳实践:`with` 语句


文件操作完成后,必须关闭文件以释放系统资源。Python 推荐使用 `with` 语句来处理文件,它能确保文件在代码块执行完毕后(无论是否发生异常)自动关闭。# 不推荐:需要手动()
f = open('', 'r', encoding='utf-8')
content = ()
()
# 推荐:使用with语句,自动管理文件关闭
with open('', 'r', encoding='utf-8') as f:
content = ()
print(content)

2. 文本文件读写

文本文件是最常见的文件类型。Python 提供了多种方法来读取和写入文本数据。

2.1 读取文本文件



`(size=-1)`:读取文件的全部内容,并返回一个字符串。`size` 参数可选,指定读取的字符数。
`(size=-1)`:读取文件的一行内容,包括行末的换行符 ``。
`()`:读取所有行,并返回一个包含每行字符串(包括 ``)的列表。
迭代文件对象:对于大文件,直接迭代文件对象是最内存高效的方式,它会逐行读取。

# 写入一些示例内容
with open('', 'w', encoding='utf-8') as f:
("Hello, Python!")
("This is line two.")
("And the third line.")
# 使用read()
with open('', 'r', encoding='utf-8') as f:
full_content = ()
print("--- full_content ---")
print(full_content)
# 使用readline()
with open('', 'r', encoding='utf-8') as f:
print("--- line by line ---")
print((), end='') # end='' 避免额外换行
print((), end='')
# 使用readlines()
with open('', 'r', encoding='utf-8') as f:
lines = ()
print("--- lines as list ---")
print(lines)
# 迭代文件对象 (推荐用于大文件)
with open('', 'r', encoding='utf-8') as f:
print("--- iterating over file object ---")
for line in f:
print(()) # strip() 去除行末换行符

2.2 写入文本文件



`(string)`:将字符串写入文件。不会自动添加换行符,需要手动添加 ``。
`(list_of_strings)`:将一个字符串列表写入文件。同样不会自动添加换行符。

# 写入单行
with open('', 'w', encoding='utf-8') as f:
("这是第一行文本。")
("这是第二行。")
# 写入多行 (writelines)
data = ["Hello World", "Python is great", "File I/O is fun"]
with open('', 'w', encoding='utf-8') as f:
(data)
# 追加内容
with open('', 'a', encoding='utf-8') as f:
("这是追加的内容。")

3. 结构化数据格式读写

对于需要组织和存储的数据,CSV 和 JSON 是两种非常流行的格式。Python 的标准库提供了专门的模块来处理它们。

3.1 CSV 文件操作


CSV (Comma Separated Values) 文件以纯文本形式存储表格数据。Python 的 `csv` 模块提供了强大的功能来读写 CSV 文件。import csv
# 写入CSV文件
data_to_write = [
['Name', 'Age', 'City'],
['Alice', 30, 'New York'],
['Bob', 24, 'London']
]
with open('', 'w', newline='', encoding='utf-8') as f:
writer = (f)
(data_to_write) # writerow() 写入一行
# 读取CSV文件
with open('', 'r', newline='', encoding='utf-8') as f:
reader = (f)
for row in reader:
print(row)
# 使用 DictReader/DictWriter (推荐,将每行视为字典)
# 写入
data_dict = [
{'Name': 'Charlie', 'Age': 35, 'City': 'Paris'},
{'Name': 'David', 'Age': 28, 'City': 'Berlin'}
]
fieldnames = ['Name', 'Age', 'City']
with open('', 'w', newline='', encoding='utf-8') as f:
writer = (f, fieldnames=fieldnames)
() # 写入表头
(data_dict)
# 读取
with open('', 'r', newline='', encoding='utf-8') as f:
reader = (f)
for row in reader:
print(row['Name'], row['Age'], row['City'])

注意 `newline=''` 参数,它可以防止在 Windows 系统上写入 CSV 文件时出现额外的空行。

3.2 JSON 文件操作


JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。Python 的 `json` 模块提供了 `dump` 和 `load` 方法来处理 JSON 数据。import json
# Python 字典
data = {
"name": "Alex",
"age": 29,
"isStudent": False,
"courses": ["Python", "JavaScript", "SQL"]
}
# 写入JSON文件
with open('', 'w', encoding='utf-8') as f:
(data, f, indent=4, ensure_ascii=False) # indent使输出更美观,ensure_ascii=False支持非ASCII字符
# 读取JSON文件
with open('', 'r', encoding='utf-8') as f:
loaded_data = (f)
print(loaded_data)
print(loaded_data['name'])
# 从字符串加载 / 到字符串转储
json_string = (data, indent=2, ensure_ascii=False)
print("--- JSON string ---")
print(json_string)
parsed_from_string = (json_string)
print(parsed_from_string['courses'])

4. 二进制文件操作

当处理非文本数据(如图像、音频、或其他程序生成的特定格式文件)或需要序列化/反序列化 Python 对象时,就需要用到二进制文件操作。在打开模式中添加 `'b'` 即可。

4.1 读写字节


在二进制模式下,`read()` 和 `write()` 方法处理的是字节 (bytes) 对象,而不是字符串。# 写入二进制数据
with open('', 'wb') as f:
(b'Hello World') # 注意是b''字节字符串
(bytes([0, 1, 2, 255])) # 也可以直接写入字节列表
# 读取二进制数据
with open('', 'rb') as f:
content = ()
print("--- Binary content ---")
print(content)
print(list(content)) # 转换为字节列表方便查看

4.2 Python 对象序列化 (Pickle)


Python 的 `pickle` 模块可以将几乎任何 Python 对象序列化(即转换为字节流)并存储到文件中,之后再反序列化还原回内存中的对象。这对于保存程序状态或在不同进程间传递 Python 对象非常有用。import pickle
class MyObject:
def __init__(self, name, value):
= name
= value
def __repr__(self):
return f"MyObject(name='{}', value={})"
obj = MyObject("Test Object", 123)
my_list = [1, 2, {'a': 10}, obj]
# 序列化对象到文件
with open('', 'wb') as f:
(my_list, f)
# 从文件反序列化对象
with open('', 'rb') as f:
loaded_list = (f)
print("--- Loaded object ---")
print(loaded_list)
print(loaded_list[3].name)

重要提示: `pickle` 模块不安全!反序列化来自未知或不可信源的 pickle 数据可能导致任意代码执行。务必只从信任的来源加载 pickle 文件。

5. 文件指针与文件定位

文件对象维护一个文件指针,指示下一次读写操作将从何处开始。可以通过 `tell()` 和 `seek()` 方法来管理文件指针。
`()`:返回当前文件指针的位置(从文件开头算起的字节数)。
`(offset, whence=0)`:移动文件指针。

`offset`:偏移量。
`whence`:可选参数,默认为 `0`(从文件开头),`1`(从当前位置),`2`(从文件末尾)。



with open('', 'r', encoding='utf-8') as f:
print((7)) # 读取 "Hello, "
print(()) # 打印当前位置 (假设为 7)
(0) # 移动到文件开头
print(()) # 再次读取第一行
(0, 2) # 移动到文件末尾 (whence=2)
print(()) # 打印文件总大小 (字节数)

6. 错误处理与文件系统操作

文件操作常常伴随着各种异常,如 `FileNotFoundError`、`IOError` 等。使用 `try...except` 块可以优雅地处理这些错误。try:
with open('', 'r') as f:
content = ()
except FileNotFoundError:
print("错误:文件不存在!")
except IOError as e:
print(f"发生IO错误: {e}")

此外,`os` 和 `pathlib` 模块提供了与文件系统交互的更多功能,例如检查文件是否存在、删除文件、重命名文件、创建目录等。import os
from pathlib import Path
# 检查文件或目录是否存在
print(('')) # True
print(Path('').exists()) # True
# 删除文件
# ('')
# 重命名文件
# ('', '')
# 使用 pathlib 创建目录
# Path('new_directory').mkdir(exist_ok=True)

结语

Python 提供了全面且易用的文件 I/O 接口,无论是简单的文本处理,还是复杂的结构化数据(CSV、JSON)和二进制对象(Pickle)操作,都能得心应手。掌握 `open()` 函数的各种模式、`with` 语句的最佳实践、编码的重要性,以及针对不同数据格式的专用模块,将使您在日常编程中更加高效和可靠。不断实践和探索,您将成为文件处理的高手。

2025-11-02


上一篇:Python文件终极指南:从解释器到第三方库,全面解析Python文件在系统中的位置

下一篇:Python Lambda函数在字符串拼接中的应用:性能、可读性与最佳实践深度解析