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

执行Python代码遇ValueError:已关闭文件上的I/O操作,求原因

解决Python中"I/O operation on closed file"报错问题

嘿,我来帮你捋清楚这个问题的根源和解决办法!你遇到的这个报错,核心是修改了sys.stdout后没有正确恢复,导致后续print语句试图往已关闭的流里写数据。

先看你的代码和对应的报错信息:

你的代码

#! /usr/bin/python
import sys
a = [ 10, 12, 13, 14]
sys.stdout=open("file.txt","w")
print("++++++++")
print("***xyz***")
print("++++++++")
sys.stdout.close()
for i in a:
    print i

报错信息

Traceback (most recent call last):
File "./test3.py", line 10, in
print i
ValueError: I/O operation on closed file

问题到底出在哪?

print语句默认是输出到sys.stdout的,你把sys.stdout替换成了指向file.txt的文件对象。当你调用sys.stdout.close()关闭文件后,sys.stdout并没有自动变回原来的控制台输出流——它现在还是那个已经被关闭的文件对象。所以后面执行print i时,就会尝试往一个已经关闭的文件里写数据,自然触发了这个错误。

靠谱的解决方案

这里有几种简单有效的处理方式:

1. 先保存、再恢复原始的stdout

在替换sys.stdout前,先把原来的控制台输出流存起来,写完文件后再恢复回去:

#! /usr/bin/python
import sys
a = [ 10, 12, 13, 14]
# 保存原始的控制台输出流
original_stdout = sys.stdout
sys.stdout=open("file.txt","w")
print("++++++++")
print("***xyz***")
print("++++++++")
sys.stdout.close()
# 恢复回原来的控制台输出
sys.stdout = original_stdout
for i in a:
    print i

2. 用上下文管理器(更优雅的写法)

用with语句管理文件,既能自动关闭文件,还能避免全局修改sys.stdout带来的问题:

#! /usr/bin/python
a = [ 10, 12, 13, 14]
with open("file.txt","w") as f:
    # 直接往文件里写内容,不用改sys.stdout
    f.write("++++++++\n")
    f.write("***xyz***\n")
    f.write("++++++++\n")
# 这里的print正常输出到控制台
for i in a:
    print i

3. 给print指定输出流(Python 2.6+支持)

Python 2.6及以上版本的print可以直接指定file参数,不用全局修改sys.stdout:

#! /usr/bin/python
a = [ 10, 12, 13, 14]
with open("file.txt","w") as f:
    print >> f, "++++++++"
    print >> f, "***xyz***"
    print >> f, "++++++++"
for i in a:
    print i

用上面任意一种方式处理后,后面的print i就能正常输出到控制台,不会再报错啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:28:34