2012-12-31 2 views
1

현재 "파이썬을 배우는 것이 힘든 방법"이며 16 장에 도달했습니다.
파일 쓰기 후에 파일 내용을 인쇄 할 수 없습니다. 아무것도 인쇄하지 않습니다.파일 쓰기 후 파일을 읽을 수 없습니다.

from sys import argv 

script, filename = argv print "We are going to erase the contents of %s" % filename print "If you don\'t want that to happen press Ctrl-C" 
print "If you want to continue press enter" 

raw_input("?") print "Opening the file..." target = open(filename, "w") 

print "Truncating the file..." target.truncate() 

print "Now i am going to ask you for 3 lines" 

line_1 = raw_input("Line 1: ") 
line_2 = raw_input("Line 2: ") 
line_3 = raw_input("Line 3: ") 

final_write = line_1 + "\n" + line_2 + "\n" + line_3 

print "Now I am going to write the lines to %s" % filename 

target.write(final_write) 

target.close 

print "This is what %s look like now" %filename 

txt = open(filename) 

x = txt.read() # problem happens here 
print x 

print "Now closing file" 

txt.close 
+3

는'target.close'이 ('target.close해야한다)를'대신 당신이해야 'with' 문을 사용하십시오. –

+0

... 그리고'txt.close'는'txt.close()'여야합니다. –

+0

그리고 write를위한 여는 이미 잘립니다. –

답변

1

당신 대신 당신이 단순히 포인터을 받고있어, 기능 target.closetxt.close를 호출 아닙니다. 그들은 함수 (또는 더 정확한 방법)이기 때문에 file.close() 함수 이름 뒤에 ()이 필요합니다.

그게 문제입니다. 파일의 모든 내용을 삭제하는 쓰기 모드로 파일을 엽니 다. 파일에 기록하지만 결코 닫지는 않아 변경 사항이 커밋되지 않으며 파일이 비어있게됩니다. 다음으로 읽기 모드로 열어 빈 파일을 읽습니다.

수동으로 변경 내용을 커밋하려면 file.flush()을 사용하십시오. 또는 파일을 닫으면 자동으로 플러시됩니다.

또한 write 모드로 열 때 코멘트가 언급 한대로 자동으로 완료 되었기 때문에 target.truncate()을 호출하는 것은 쓸모가 없습니다.

편집 : 의견에 언급 된대로 with 문을 사용하면 매우 효과적이므로 대신 사용해야합니다. http://www.python.org/dev/peps/pep-0343/에서 자세한 내용을 읽을 수 있지만 기본적으로 파일과 함께 사용하면 파일을 열고 열 때 자동으로 파일을 닫습니다. 이렇게하면 파일 닫기에 대해 걱정할 필요가 없으며 들여 쓰기 덕분에 파일이 어디에 사용되는지 명확하게 볼 수있을 때 훨씬 좋아집니다.

빠른 예 :

f = open("test.txt", "r") 
s = f.read() 
f.close() 

with 문을 사용하여 찾고 짧고 더 나은 수행 할 수 있습니다

with open("test.txt", "r") as f: 
    s = f.read() 
+0

해결책은 정확하지만 설명은 정확하지 않습니다. –

+0

더 나은가요? :-) –

+0

예, 훨씬 좋습니다. –

관련 문제