Python文件读写基础教程
时间:2025-07-31 11:00:10 215浏览 收藏
golang学习网今天将给大家带来《Python文件读写入门教程》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习文章或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!
Python文件读写操作的核心步骤是:1. 打开文件;2. 进行读或写操作;3. 关闭文件。推荐使用 with open() 语句,它能自动管理文件关闭,确保资源正确释放。写入文件使用 'w' 模式会覆盖原有内容,追加内容使用 'a' 模式,读取文件使用 'r' 模式。逐行读取或分块读取适用于大文件处理,避免内存溢出。编码方面,UTF-8 是首选,但需根据文件来源选择合适编码,防止解码错误。
Python的文件读写操作,其实远没有一些人想象中那么复杂。核心思路就那么几步:打开文件、进行操作(读或写)、然后关闭文件。而Python之所以被大家喜爱,很大一部分原因就在于它把这些过程封装得非常优雅,尤其是那个 with open()
语句,简直是文件操作的“瑞士军刀”。简单来说,就是用 open()
函数拿到文件对象,然后调用它的方法去读写,最后确保文件被妥善关闭。

解决方案
Python处理文件读写,最推荐且最常用的模式就是结合 with
语句。这不仅代码简洁,更重要的是它能确保文件在操作完成后,无论是否发生错误,都能被正确关闭,避免资源泄露。
写入文件:

如果你想把一些内容写入到一个新文件,或者覆盖一个已有的文件,可以使用 '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()
这种方式来处理文件。这不仅仅是因为它看起来更“Pythonic”,更深层次的原因在于它提供了一种强大的“上下文管理”机制。
想象一下,你打开了一扇门(文件),进去做了一些事情(读写),然后需要确保门被关上,无论你在里面是顺利完成任务,还是不小心摔了一跤(程序报错)。如果门没关,可能会有各种各样的问题,比如其他程序无法访问这个文件,或者系统资源被白白占用。
with open()
的“魔力”就在于,它是一个上下文管理器。当代码执行到 with
语句块的开头时,它会自动调用文件对象的 __enter__
方法,获取文件资源。当代码块执行完毕,无论是正常结束,还是中间抛出了异常,它都会自动调用文件对象的 __exit__
方法。而文件对象的 __exit__
方法,就是用来确保文件被正确关闭的。
这意味着,你不再需要手动写 f.close()
,也不用担心在 try...except...finally
结构中忘记关闭文件,或者因为某个地方的异常导致 finally
块都没执行到。它让文件操作变得更安全、更健壮,同时代码也更加简洁易读。对我来说,这是一种解放,让我可以更专注于业务逻辑,而不是纠结于资源管理这些细节。
处理文件编码:UTF-8 是万能药吗?
说到文件读写,就不得不提编码。这是很多初学者,甚至一些有经验的开发者都会踩坑的地方。我见过太多 UnicodeDecodeError
和 UnicodeEncodeError
的报错,它们往往都指向同一个问题:编码不匹配。
UTF-8 确实是目前最推荐的编码方式,它能兼容世界上绝大多数语言的字符,包括中文、日文、韩文等等。对于我们创建的新文件,我强烈建议你始终使用 encoding='utf-8'
。这就像给你的文件贴上了一个国际通用的标签,保证了它在不同系统、不同程序之间传输和读取时,都能正确显示内容。
然而,UTF-8 并非“万能药”。它的局限性在于,如果你要处理的文件不是你创建的,而是别人给的,或者是一些历史遗留系统生成的文件,那么它们很可能不是 UTF-8 编码的。例如,在中文环境中,你可能会遇到 GBK、GB2312 甚至 Big5 编码的文件。在某些西方国家,Latin-1(或 ISO-8859-1)也很常见。
这时候,如果你仍然强制用 encoding='utf-8'
去读取一个 GBK 编码的文件,Python 就会因为无法识别这些字节序列而抛出 UnicodeDecodeError
。反之,如果你用 GBK 模式去写入一些只存在于 UTF-8 中的特殊字符,就可能遇到 UnicodeEncodeError
。
所以,我的建议是:
- 明确指定编码: 无论读写,都养成习惯明确指定
encoding
参数,不要依赖系统默认编码。因为不同操作系统的默认编码可能不同(比如Windows上可能是GBK,Linux上可能是UTF-8),这会导致你的代码在不同环境下表现不一致。 - 了解源文件编码: 如果是读取外部文件,尝试去了解其原始编码。很多文本编辑器(如Notepad++、VS Code)都能显示文件的编码信息。
- 错误处理: 当你不确定编码时,可以尝试几种常见的编码,或者使用
chardet
这样的第三方库来猜测文件编码(虽然不总是100%准确,但能提供很好的参考)。在读取时,也可以考虑使用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文件读写基础教程》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
323 收藏
-
397 收藏
-
483 收藏
-
463 收藏
-
331 收藏
-
475 收藏
-
240 收藏
-
169 收藏
-
222 收藏
-
340 收藏
-
144 收藏
-
377 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习