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
相关产品推荐
相关产品推荐

