2016-12-02 7 views
0

У меня есть следующий код, и я получаю сообщение об ошибке: операция ввода-вывода в закрытом файле, несмотря на открытие файла.Операция ввода-вывода Python в закрытом файле, почему ошибка? Код ниже

Я создаю файл .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

Пожалуйста, добавьте полный ответ на свой вопрос. –

+0

@KlausD. отредактирован! –

ответ

1

Здесь вы переопределить sys.stdout, чтобы указать на открытый файл:

sys.stdout = open('answers.txt', 'w') 

Позже, при попытке печати на STDOUTsys.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) 
+0

Спасибо, не совсем понял, что я делаю, с sys.stdout –

1

Вы были перезапись sys.stdout с дескриптором файла. Как только вы его закроете, вы сможете больше писать. Поскольку print() пытается написать sys.stdout, это не удастся.

Вам следует попробовать открыть файл в другом режиме (например, w+), используйте StringIO или скопируйте оригинал sys.stdout и восстановите его позже.

+0

Спасибо, не совсем понял, что я делал с sys.stdout –