Python中open函数常见问题与解决方法
with open('comments.txt', 'r') as f:
for line in f.readlines():
line = line.strip()
res_list.append(json.loads(line))
代码入如上 问题: shell 里执行上面脚本能够读取整个文件内容,但是在 cronab 里面只能读取最后两行。问题比较诡异。
Python中open函数常见问题与解决方法
4 回复
Python的open()函数是文件操作的基础,但确实有些坑需要注意。最常见的问题就是编码和文件路径。
1. 编码问题
这是最头疼的。Windows记事本默认保存的文本文件是gbk编码,而Python默认用utf-8读取,直接报错:
# 错误示例
with open('中文.txt', 'r') as f:
content = f.read() # UnicodeDecodeError!
解决方法很简单,指定编码:
# 正确做法
with open('中文.txt', 'r', encoding='gbk') as f: # 如果是gbk编码
content = f.read()
# 或者统一用utf-8保存文件
with open('中文.txt', 'w', encoding='utf-8') as f:
f.write('内容')
2. 文件路径问题 相对路径可能找不到文件,特别是用IDE运行时。建议:
import os
# 方法1:使用绝对路径
path = r'C:\Users\name\file.txt'
# 方法2:基于当前脚本位置
base_dir = os.path.dirname(__file__)
file_path = os.path.join(base_dir, 'data.txt')
3. 忘记关闭文件 老生常谈但总有人忘:
# 错误做法
f = open('file.txt', 'r')
data = f.read()
# 忘记f.close()!
# 正确做法:用with语句自动关闭
with open('file.txt', 'r') as f:
data = f.read()
# 这里自动关闭文件
4. 模式混淆
'r+'和'w+'容易搞混:
'r+':读写,文件必须存在'w+':读写,文件不存在会创建,存在会清空!
# 想追加内容却用了w+
with open('log.txt', 'w+') as f: # 清空了原有内容!
f.write('新日志')
# 应该用a+
with open('log.txt', 'a+') as f: # 追加模式
f.write('新日志')
5. 大文件处理 别一次性读取大文件:
# 错误:内存爆炸
with open('huge_file.txt', 'r') as f:
all_data = f.read() # 如果文件10GB...
# 正确:逐行或分块读取
with open('huge_file.txt', 'r') as f:
for line in f: # 惰性读取
process(line)
# 或分块读取
chunk_size = 1024 * 1024 # 1MB
with open('huge_file.txt', 'rb') as f:
while chunk := f.read(chunk_size):
process(chunk)
总结建议:用with语句、明确编码、注意文件模式。
楼上说的对,写在 cron 里的都要写绝对路径(包括 python 的路径),另外发帖之前先预览一下,代码格式化没写好
确实是因为路径问题,感谢。


