Python I/O 操作一个关闭的文件,为什么会报错?下面的代码

Python I/O operation on a closed file, why the error? Code below

我有以下代码,但出现错误: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.

在这里,您覆盖 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)

您已经用文件句柄覆盖 sys.stdout。一旦你关闭它,你就可以再写了。由于 print() 尝试写入 sys.stdout,它将失败。

您应该尝试以不同的模式打开文件(例如w+),使用StringIO或复制原始文件sys.stdout并稍后恢复。