2012-05-16 5 views
1

for 루프를 실행 한 후 어떤 이유로 ouput 텍스트 파일을 읽을 수 없습니다. 예를 들어 : 나는 루프를 주석 경우우분투를 사용하여 for 루프를 사용한 파일을 읽을 수없는 이유

for line in a: 
name = (x) 
f = open('name','w') 
for line in b: 
get = (something) 
f.write(get) 
for line in c: 
get2 = (something2) 
f.write(get2) 

(the below works if the above is commented out only) 

f1 = open(name, 'r') 
for line in f1: 
print line 

, 나는 파일을 읽고 내용을 인쇄 할 수 있어요.

나는 코딩에 매우 익숙하며, 이것은 내가 실종되었다는 것을 분명히합니다. 그러나 나는 그것을 이해하지 못하는 것 같습니다. 나는 Google을 사용했지만 더 많이 읽을수록 나는 뭔가를 놓치고 있다고 느낍니다. 모든 조언을 부탁드립니다.

+4

쓰기가 끝나면 파일을'.close()'하십시오. 더 나은 방법은'with' 블록의 끝에서 파일을 닫는 컨텍스트 관리자 ('with' 문)를 사용하는 것입니다. 더하기 예외는 무료로 처리됩니다 – bernie

+0

적어도, 당신은 쓰고있는 파일을 플러시해야합니다. – kindall

+0

코드를 올바르게 붙여 넣었습니까? 당신의'f = open ('name', 'w')'줄은 for 회 돌이 안에서 일어나므로 회 돌이를 돌 때마다 재 지정 될 것이고, 마지막으로 루프를 실행합니다. – Marius

답변

3

@bernie는 위의 그의 의견에 적합합니다. 문제는 open(..., 'w') 일 때 파일이 비어있는 것으로 다시 쓰여지지만, 버퍼가 채워지거나 close()이 호출 될 때까지 OS가 실제로 write을 디스크에 쓰지 않는다는 것입니다. 디스크에 쓰기가 느리기 때문에이 지연은 작업 속도를 높이는 데 도움이됩니다. flush()을 호출하여 파일을 닫지 않고 강제로 호출 할 수도 있습니다.

과 같을 것이다 언급 된 with 문 버니 :

with open('name', 'w') as f: 
    for line in b: 
     b.write(...) 
    for line in c: 
     b.write(...) 
# f is closed now that we're leaving the with block 
# and any writes are actually written out to the file 

with open('name', 'r') as f: 
    for line in f: 
     print line 

파이썬 2.5이 아닌 2.6 또는 2.7을 사용하는 경우, 당신은 당신의 파일의 맨 위에 from __future__ import with_statement을해야 할 것이다.

+0

파일을 닫지 않은 것 같습니다. 마리우스 - 당신이 맞습니다. 나는 그 잘못을 베꼈습니다. 사실 이름을 사용하여 항상 바뀌는 XML 파일 내부의 출력 파일 이름을 만들었습니다. 저 밖에는 더 좋은 방법이 있다는 것을 압니다. 그러나 저는 아직 그걸 알지 못합니다. 도움을 주신 모든 분들께 감사드립니다. – craigbdill

+0

이 경우 for 루프보다 for를 사용하는 것이 더 좋을까요? 무엇이 더 나은 코딩으로 간주 될 것입니까? – craigbdill

+0

버니가 인용 한 이유 때문에'with'가 더 낫지 만'for' 루프를 전혀 삭제할 수 없습니다. – tripleee

관련 문제