我有以下代码,并且收到错误:尽管打开了文件,但对已关闭的文件进行了I / O操作。
我正在创建.txt文件并将字典值写入.txt文件,然后关闭文件。
之后,我尝试为创建的文件打印SHA256摘要。
sys.stdout = open('answers.txt', 'w')
for key in dictionary:
print(dictionary[key])
sys.stdout.close()
f = open('answers.txt', 'r+')
#print(hashlib.sha256(f.encode('utf-8')).hexdigest())
m = hashlib.sha256()
m.update(f.read().encode('utf-8'))
print(m.hexdigest())
f.close()
为什么我收到此错误?
Traceback (most recent call last):
File "filefinder.py", line 97, in <module>
main()
File "filefinder.py", line 92, in main
print(m.hexdigest())
ValueError: I/O operation on closed file.
答案 0 :(得分:2)
在此,您覆盖sys.stdout
以指向您打开的文件:
sys.stdout = open('answers.txt', 'w')
稍后,当您尝试打印到STDOUT
sys.stdout
时仍然指向(现已关闭)answers.txt
文件:
print(m.hexdigest())
我认为没有理由在此处覆盖sys.stdout
。相反,只需将file
选项传递给print()
:
answers = open('answers.txt', 'w')
for key in dictionary:
print(dictionary[key], file=answers)
answers.close()
或者,使用自动关闭文件的with
语法:
with open('answers.txt', 'w') as answers:
for key in dictionary:
print(dictionary[key], file=answers)
答案 1 :(得分:1)
您已使用文件句柄覆盖sys.stdout
。一旦你关闭它,你就可以写它了。由于print()
尝试写入sys.stdout
,因此会失败。
您应该尝试以其他模式打开文件(例如w+
),使用StringIO
或复制原始sys.stdout
并稍后恢复。