python文件读写操作的核心步骤是:1. 打开文件;2. 进行读或写操作;3. 关闭文件。推荐使用 with open() 语句,它能自动管理文件关闭,确保资源正确释放。写入文件使用 'w' 模式会覆盖原有内容,追加内容使用 'a' 模式,读取文件使用 'r' 模式。逐行读取或分块读取适用于大文件处理,避免内存溢出。编码方面,utf-8 是首选,但需根据文件来源选择合适编码,防止解码错误。

Python的文件读写操作,其实远没有一些人想象中那么复杂。核心思路就那么几步:打开文件、进行操作(读或写)、然后关闭文件。而Python之所以被大家喜爱,很大一部分原因就在于它把这些过程封装得非常优雅,尤其是那个
with open()
open()

Python处理文件读写,最推荐且最常用的模式就是结合
with
写入文件:
立即学习“Python免费学习笔记(深入)”;

如果你想把一些内容写入到一个新文件,或者覆盖一个已有的文件,可以使用
'w'
# 写入文本内容到文件
# 如果文件不存在,会创建;如果文件存在,会清空原有内容再写入
try:
with open('我的第一个文件.txt', 'w', encoding='utf-8') as f:
f.write("你好,这是我用Python写入的第一行文字。\n")
f.write("第二行内容也很重要。\n")
print("内容已成功写入 '我的第一个文件.txt'")
except IOError as e:
print(f"写入文件时发生错误: {e}")
# 写入多行内容
try:
lines_to_write = [
"Python文件操作真是方便!\n",
"我喜欢这种简洁。\n",
"希望你也能喜欢。\n"
]
with open('多行文本示例.txt', 'w', encoding='utf-8') as f:
f.writelines(lines_to_write)
print("多行内容已成功写入 '多行文本示例.txt'")
except IOError as e:
print(f"写入多行文件时发生错误: {e}")如果你想在文件末尾追加内容,而不是覆盖,那就用
'a'

# 追加内容到文件末尾
try:
with open('我的第一个文件.txt', 'a', encoding='utf-8') as f:
f.write("这是追加的新内容。\n")
print("新内容已追加到 '我的第一个文件.txt'")
except IOError as e:
print(f"追加内容时发生错误: {e}")读取文件:
读取文件通常使用
'r'
# 读取整个文件内容
try:
with open('我的第一个文件.txt', 'r', encoding='utf-8') as f:
content = f.read()
print("\n--- '我的第一个文件.txt' 的全部内容 ---")
print(content)
except FileNotFoundError:
print("'我的第一个文件.txt' 文件未找到。")
except IOError as e:
print(f"读取文件时发生错误: {e}")
# 逐行读取文件内容(非常推荐,尤其处理大文件时)
try:
print("\n--- 逐行读取 '我的第一个文件.txt' ---")
with open('我的第一个文件.txt', 'r', encoding='utf-8') as f:
for line_num, line in enumerate(f, 1):
print(f"第 {line_num} 行: {line.strip()}") # .strip() 去除行尾的换行符和空白
except FileNotFoundError:
print("'我的第一个文件.txt' 文件未找到。")
except IOError as e:
print(f"逐行读取文件时发生错误: {e}")
# 读取所有行到一个列表中
try:
with open('多行文本示例.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
print("\n--- '多行文本示例.txt' 的所有行(列表形式)---")
for i, line in enumerate(lines):
print(f"列表索引 {i}: {line.strip()}")
except FileNotFoundError:
print("'多行文本示例.txt' 文件未找到。")
except IOError as e:
print(f"读取所有行时发生错误: {e}")with open()
我个人在日常开发中,几乎都会选择
with open()
想象一下,你打开了一扇门(文件),进去做了一些事情(读写),然后需要确保门被关上,无论你在里面是顺利完成任务,还是不小心摔了一跤(程序报错)。如果门没关,可能会有各种各样的问题,比如其他程序无法访问这个文件,或者系统资源被白白占用。
with open()
with
__enter__
__exit__
__exit__
这意味着,你不再需要手动写
f.close()
try...except...finally
finally
说到文件读写,就不得不提编码。这是很多初学者,甚至一些有经验的开发者都会踩坑的地方。我见过太多
UnicodeDecodeError
UnicodeEncodeError
UTF-8 确实是目前最推荐的编码方式,它能兼容世界上绝大多数语言的字符,包括中文、日文、韩文等等。对于我们创建的新文件,我强烈建议你始终使用
encoding='utf-8'
然而,UTF-8 并非“万能药”。它的局限性在于,如果你要处理的文件不是你创建的,而是别人给的,或者是一些历史遗留系统生成的文件,那么它们很可能不是 UTF-8 编码的。例如,在中文环境中,你可能会遇到 GBK、GB2312 甚至 Big5 编码的文件。在某些西方国家,Latin-1(或 ISO-8859-1)也很常见。
这时候,如果你仍然强制用
encoding='utf-8'
UnicodeDecodeError
UnicodeEncodeError
所以,我的建议是:
encoding
chardet
errors='ignore'
errors='replace'
总之,UTF-8 是未来,但兼容历史是现实。理解编码的原理和常见问题,能帮你省去很多调试的烦恼。
处理大文件,比如几GB甚至几十GB的日志文件或数据集时,直接使用
f.read()
逐行迭代(最常用且高效): Python 的文件对象本身就是可迭代的。这意味着你可以直接在
for
# 示例:逐行处理大文件
# 假设有一个名为 'large_log.txt' 的大文件
try:
with open('large_log.txt', 'r', encoding='utf-8') as f:
for line_num, line in enumerate(f, 1):
# 这里可以对每一行进行处理,比如解析、筛选、写入另一个文件等
if "ERROR" in line:
print(f"在第 {line_num} 行发现错误: {line.strip()}")
# 实际应用中,你可能不会直接打印,而是进行更复杂的逻辑
# 比如将处理后的行写入新文件,或者累加统计数据
except FileNotFoundError:
print("大文件 'large_log.txt' 未找到,请创建一个示例文件。")
# 创建一个模拟的大文件
with open('large_log.txt', 'w', encoding='utf-8') as f_mock:
for i in range(100000): # 写入10万行
f_mock.write(f"这是第 {i+1} 行日志。\n")
if i % 10000 == 0:
f_mock.write(f"ERROR: Something went wrong at line {i+1}!\n")
print("已创建模拟大文件 'large_log.txt',请重新运行程序。")
except IOError as e:
print(f"处理大文件时发生错误: {e}")这种方式的优点是内存占用极低,因为它每次只加载一行数据,处理完就释放。
分块读取 f.read(size)
f.read(size)
# 示例:分块读取文件
# 假设我们要读取一个二进制文件或者按块处理文本
chunk_size = 4096 # 每次读取4KB
try:
with open('binary_data.bin', 'rb') as f_in, open('processed_data.bin', 'wb') as f_out:
while True:
chunk = f_in.read(chunk_size)
if not chunk: # 读取到文件末尾
break
# 在这里处理 chunk,例如解密、压缩、写入新文件等
f_out.write(chunk) # 简单示例:直接写入到新文件
print("二进制数据已分块处理并写入 'processed_data.bin'")
except FileNotFoundError:
print("二进制文件 'binary_data.bin' 未找到。")
# 创建一个模拟的二进制文件
with open('binary_data.bin', 'wb') as f_mock:
f_mock.write(b'This is some binary data for testing purposes.' * 1000)
print("已创建模拟二进制文件 'binary_data.bin',请重新运行程序。")
except IOError as e:
print(f"分块处理文件时发生错误: {e}")这种方式同样能有效控制内存使用,因为它每次只加载一个数据块。
使用 f.readline()
for line in f:
while True: line = f.readline(); if not line: break;
这些技巧的核心思想都是“流式处理”,即不一次性加载所有数据,而是像水流一样,一点一点地处理。这对于内存有限但数据量巨大的场景至关重要。
以上就是Python文件读写怎么做?简单实用的示例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号