You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python文件读写异常:file.read()抛出io.UnsupportedOperation错误

问题根源与解决方案

核心错误原因

你用open("fileA.txt", "a")打开文件时,使用的是追加写模式("a"),该模式仅授予写入权限,完全不支持读取操作,因此调用read()会直接抛出io.UnsupportedOperation: not readable错误。此外,"a"模式下调用truncate(0)清空文件属于不规范用法,追加模式的设计初衷是在文件末尾追加内容,而非修改已有内容。

优化方案1:无需文件中转(推荐)

你的需求是收集错误信息后返回给主程序,完全没必要通过文件中转,直接在内存中拼接字符串即可,既避免文件操作问题,又提升效率:

exception_caught = False
error_messages = []

if caseA["is_err"]:
    exception_caught = True
    error_messages.append(caseA["err_message"])
if caseB["is_err"]:
    exception_caught = True
    error_messages.append(caseB["err_message"])
if caseC["is_err"]:
    exception_caught = True
    error_messages.append(caseC["err_message"])

# 用换行符拼接所有错误信息,无错误则返回空字符串
retval = "\n".join(error_messages) if error_messages else ""
return {"exception_caught": exception_caught, "error_message": retval}

优化方案2:必须使用文件中转时的正确操作

如果因其他模块依赖该文件必须写入后读取,需遵循以下文件操作规范:

exception_caught = False

# 用with语句自动管理文件,避免资源泄漏
with open("fileA.txt", "w+", encoding="utf-8") as err_repo:
    # 清空文件(w+模式本身会清空,这里可省略truncate)
    err_repo.truncate(0)
    
    if caseA["is_err"]:
        exception_caught = True
        err_repo.write(f"{caseA['err_message']}\n")
    if caseB["is_err"]:
        exception_caught = True
        err_repo.write(f"{caseB['err_message']}\n")
    if caseC["is_err"]:
        exception_caught = True
        err_repo.write(f"{caseC['err_message']}\n")
    
    # 将文件指针移到开头,否则读取会从末尾开始返回空内容
    err_repo.seek(0)
    retval = err_repo.read().strip()  # 去除多余换行和空格

return {"exception_caught": exception_caught, "error_message": retval}

文件操作关键注意事项

  • 模式匹配需求:
    • "r":只读(默认),文件必须存在
    • "w":只写,清空原有内容或创建新文件
    • "a":追加写,指针固定在末尾,仅支持写入
    • "r+"/"w+":读写模式,前者要求文件已存在,后者会清空或创建文件
    • "a+":读写+追加,读取前必须用seek(0)移动指针到开头
  • 用with语句管理文件:自动处理文件关闭,避免资源泄漏
  • 关注指针位置:写入操作后指针会停在文件末尾,读取前需手动移到开头
  • 避免冗余IO:内存可处理的逻辑尽量不依赖文件,减少不必要的磁盘操作

内容的提问来源于stack exchange,提问作者Coder man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:10:31