关闭文件上的Python I / O操作,为什么会出错?以下代码

时间:2016-12-02 03:22:36

标签: python io hashlib

我有以下代码,并且收到错误:尽管打开了文件,但对已关闭的文件进行了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.

2 个答案:

答案 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并稍后恢复。