2016-08-09 3 views
1

파일에서 데이터를 열고 쓰는 동안 Python의 동작에 대한 질문이 있습니다. 몇 시간 동안 실행되도록 만들어진 큰 코드가 있으며 ASCII 파일로 텍스트를 쓰는 작업이 필요합니다. 이 코드는 with open 메서드를 사용하며 프로그램이 실행되는 동안 파일을 열어 두었습니다. 때로는 프로그램 실행을 중지해야하므로 Process finished with exit code -1 종료 상태가됩니다.파일에 쓰는 동안의 이상한 동작

나를 괴롭히는 것은 코드가 실행 중일 때 텍스트가 ASCII 파일로 작성되었다는 확인을 받지만 코드를 중지하면 파일이 비어있는 것입니다.

import time 

# Create the .txt files 
with open('D:/Stuff/test1.txt', 'w') as write1: 
    pass 

with open('D:/Stuff/test2.txt', 'w') as write2: 
    pass 

# Write some text into the.txt files 
# Case 1. The code runs until the end 
with open ('D:/Stuff/test1.txt', 'a') as infile1: 
    a = range(1, 50, 1) 
    infile1.write(str(a)) 
    print "Writing completed!" 

# Case 2. I stop the execution manually. I use time.sleep to be able to stop it in this example 
with open ('D:/Stuff/test2.txt', 'a') as infile2: 
    b = range(1, 50, 1) 
    infile2.write(str(b)) 
    print "Writing completed!" 

    print "Start sleep" 
    time.sleep(10) 

    << At this line I end the script manually>> 

    print "End sleep" 

무엇 발생하는 사례 1, 텍스트가 파일에 기록되어 있지만, 경우 2, 내가 그들에게 빈 얻을 수 있습니다 : 아래 코드의 예를 들어 보자. 왜 이런 일이 발생하며 어떻게 해결할 수 있습니까?

+1

관련이 없지만 첫 번째 몇 줄은 'w'가 필요하지 않습니다. 'a'가 존재하지 않으면 파일을 만듭니다. – Wboy

+0

나는 그것을 몰랐습니다. 감사! :) – Litwos

+0

어떻게 플러시를 우회하기 위해 주어진 위치에서 스크립트를 종료 했습니까? *가 자동으로 수행합니까? – guidot

답변

1

처음에는 버퍼 대신 실제로 디스크에 쓰고 싶을 수 있습니다. 그렇게하는

한 가지 방법은 infile2.flush()을 사용하는 것입니다 :

infile2.write(str(b)) 
infile2.flush() # <- here 
print "Writing completed!" 

다른 방법은 open the file with no buffering이다. open 전화에서 buffering=0을 설정하십시오.

이전의 방법은 플러시를 잊지 않도록합니다. 반면에, 플러시 할 때 "체크 포인트"를보다 잘 제어 할 수 있습니다. 자동으로 버퍼링되지 않은 입출력은 일반적으로 처리량이 낮습니다.

+0

아, 작동합니다. 어떤 방법을 사용하는 것이 더 낫습니까? 버퍼링 또는 'flush()'로 열기? – Litwos

+0

@Litwos 끝에 단락을 추가했습니다. 그것은 절충점입니다. –

+0

더 큰 컨트롤을 위해 'flush()'메서드를 계속 사용한다고 생각합니다. 고맙습니다! :) – Litwos