hello,大家好呀~我是星禾。
不知道你们有没有这种感觉:学编程的时候,前面变量、循环、函数都还挺顺的,一到文件操作就开始卡壳——
文件找不到?编码报错?忘记关闭?数据莫名其妙丢失?
这些问题,我当年学Python的时候基本全踩过一遍😭
那今天我就把这些坑一次性说清楚,看完你就不怕跟文件打交道了!
▶一、打开文件:with语句是"保命神器"
很多人学文件操作,第一步就是:
f = open('data.txt', 'r')content = f.read()f.close()
看起来没问题对吧?但如果 f.read() 之前代码报错,f.close() 就执行不到了,文件一直占用着,轻则数据丢失,重则程序崩溃。
正确姿势是用 with 语句:
with open('data.txt', 'r') as f: content = f.read()# 走出这个代码块,文件自动关闭,不用操心!
with 语句会自动管理文件开关,就算中间出错也能保证文件被正确关闭。
记住这个原则:任何时候打开文件,都用 with!
▶二、读取文件:不是只有 read() 一种方式
很多人读取文件只会 f.read(),把所有内容一次性读进内存。
对于小文件没问题,但如果是个几百MB的日志文件,内存直接爆掉。
根据文件大小选对方法:
# 小文件:一次性读完with open('small.txt', 'r') as f: content = f.read()# 大文件:逐行读取(内存友好)with open('large.log', 'r') as f: for line in f: print(line.strip())# 超大文件:分块读取with open('huge.txt', 'r') as f: while True: chunk = f.read(1024) # 一次读1KB if not chunk: break process(chunk)
技巧:for line in f 是最推荐的逐行读取方式,代码简洁又省内存。
▶三、写入文件:覆盖还是追加?别搞混了!
写入文件有两种模式,很多人分不清:
# 'w' 模式:覆盖写入with open('output.txt', 'w') as f: f.write('新内容') # 原文件内容被清空!# 'a' 模式:追加写入with open('output.txt', 'a') as f: f.write('新内容') # 在末尾添加,保留原有内容
想清楚再选: - 生成新文件或清空重写 → 用 'w' - 日志持续追加 → 用 'a'
▶四、编码问题:乱码的罪魁祸首
处理中文文件时,编码是个大坑。
指定编码,避免乱码:
# 读取UTF-8编码的文件with open('file.txt', 'r', encoding='utf-8') as f: content = f.read()# 写入时也指定编码with open('output.txt', 'w', encoding='utf-8') as f: f.write('中文没问题')
血的教训:读取GBK文件却用UTF-8解码?那就等着乱码吧!
如果遇到非法字符,可以这样处理:
with open('file.txt', 'r', encoding='utf-8', errors='ignore') as f: content = f.read() # 遇到无法解码的字符直接跳过
▶五、路径处理:pathlib 更香!
以前大家都用 os.path 处理路径,现在 Python 3.4+ 有了更优雅的选择 —— pathlib。
对比一下:
# os.path 方式import osfilename = os.path.join('data', 'logs', 'app.log')if os.path.exists(filename): with open(filename, 'r') as f: content = f.read()# pathlib 方式(更简洁)from pathlib import Pathp = Path('data/logs/app.log')if p.exists(): content = p.read_text() # 直接读文件!
pathlib 的优势: - 面向对象,链式调用更优雅 - Path('file.txt').read_text() 一行搞定读写 - 自动适配不同操作系统
新项目建议直接用 pathlib,代码可读性蹭蹭往上涨!
▶六、实战技巧:检查文件是否存在
正式读写前,先判断文件在不在,可以避免很多报错:
from pathlib import Pathfile_path = Path('data.txt')if file_path.exists(): content = file_path.read_text() print("文件读取成功")else: print("文件不存在,请检查路径")
或者用异常处理:
try: with open('data.txt', 'r') as f: content = f.read()except FileNotFoundError: print("文件不存在")except PermissionError: print("没有读取权限")
▶总结
Python 文件操作,记住这几点就够了:
✅ 打开文件用 with open(...) as f:
✅ 文本文件指定 encoding='utf-8'
✅ 大文件用 for line in f 逐行处理
✅ 写入前想清楚:覆盖 'w' 还是追加 'a'
✅ 新项目推荐用 pathlib 处理路径
掌握了这些,你的程序再也不怕跟文件打交道了!
今日份学习完成~
我是星禾,从大厂程序员到全职宝妈再到米核AI合伙人,一路折腾过来发现:编程这东西,踩坑不可怕,可怕的是踩完不总结,下次继续踩。
如果你觉得今天的分享有用,欢迎转发给需要的朋友~
有什么问题欢迎在评论区聊,我看到都会回复!
当然如果你也想入局AI赛道,赶上这波风口。欢迎来找我, 我这里有基础的免费资料,也有全套的系统化AI智能体+工作流搭建+AI漫剧+小龙虾课程。欢迎各位朋友的加入!