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

