2016-12-02 2 views
0

다음 코드를 가지고 있으며 오류가 발생합니다 : 파일을 열었음에도 불구하고 닫힌 파일에 대한 I/O 작업.닫힌 파일에 대한 Python 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

전체 오류 추적을 질문에 추가하십시오. –

+0

@KlausD. 편집 됨! –

답변

1

, 당신은 당신의 열려있는 파일을 가리 키도록 sys.stdout를 오버라이드 (override) :

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

, 당신은 STDOUTsys.stdout 여전히 (현재 폐쇄)를 가리키는 answers.txt 파일을 인쇄하려고 :

print(m.hexdigest()) 

여기서 sys.stdout을 무시할 이유가 없습니다. 자동으로 파일을 닫는 with 구문을 사용하여

answers = open('answers.txt', 'w') 
for key in dictionary: 
    print(dictionary[key], file=answers) 
answers.close() 

을 또는 : : 대신에, 단지 print()file 옵션을 통과 당신은 파일 핸들 sys.stdout을 덮어 쓰기 한

with open('answers.txt', 'w') as answers: 
    for key in dictionary: 
     print(dictionary[key], file=answers) 
+0

감사합니다. sys.stdout에 무엇을하고 있었는지 완전히 깨닫지 못했습니다. –

1

. 그것을 닫으면 곧 더 쓸 수 있습니다. print()sys.stdout에 쓰려고하기 때문에 실패합니다.

당신은, 다른 모드 (예를 들어 w+)에서 파일을 열어보십시오 StringIO를 사용하거나 원래 sys.stdout을 복사하여 나중에 복원해야합니다.

+0

감사합니다. sys.stdout에 무엇을하고 있는지 완전히 알지 못했습니다. –

관련 문제