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 回复

确定 shell 和 crontab 读到的是同一个文件吗? 有没有用绝对路径试试.


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 的路径),另外发帖之前先预览一下,代码格式化没写好




确实是因为路径问题,感谢。

回到顶部