2014-01-06 3 views
0

알아 내려고하는 흥미로운 점이 있습니다. 나는 큰 프로그램을 가지고 있고 그 프로그램의 일부로 .xml 파일을 만들고 그것에 쓰고있다. (그냥 lxml이나 뭐든지 쓰지 않고). 테스트를 위해 특정 코드를 자체 프로그램으로 가져 와서 문제가 발생했습니다. 트리거하지 않는 것을 제외하고 코드는 코드는 나에게 오류를 제공하지 않습니다 통해 실행파이썬에서 파일을 만들고 쓰지 만 파일을 쓰거나 닫지 않습니다.

import os 
directory = 'FileDirectory' 
name = 'Test File.xml' 

if not os.path.exists('K:\\JOBS\\' + directory + '\\XML Files\\'): 
    os.makedirs('K:\\JOBS\\' + directory + '\\XML Files\\') 
xmlJob = open('K:\\JOBS\\' + directory + '\\XML Files\\' + name, 'w') 
try: 
    xmlJob.write('Test write') 
except: 
    print "Unexpected error:", sys.exc_info()[0] 
    raise 
xmlJob.close 

하지만 파일이 만들어 동안으로 작성 아무것도 없다. 또한 파이썬을 닫지 않고 파일을 삭제할 수 없으므로 .close가 일어나지 않는 것 같습니다. 그러나 .write와 .close 뒤에 print 문을두면 프로그램이 모든 행을 히트하도록 두 문을 모두 트리거합니다. 위의 텍스트는 전체 프로그램이므로 다른 것을 혼동하지 않아도됩니다.

이제 모든 것을 사용할 때 사용으로 변경되었습니다. 그래서 코드

import os 
directory = 'FileDirectory' 
name = 'Test File.xml' 

with open('K:\\JOBS\\' + directory + '\\XML Files\\' + name, 'w') as xmlJob: 
    xmlJob.write('Test write') 

잘 실행됩니다. 그래서 분명히 open과 .close 대신에 with를 사용할 수 있습니다. 그러나 지금은 첫 번째 옵션이 실패한 이유를 알아 내려고합니다. 나는 실제로 다른 프로그램에서 똑같은 코드를 사용하여 로그 파일 등을 작성했다. 누구든지 아이디어가 있습니까?

+2

xmlJob.close without() ??? –

+0

'os.path.join()'을 사용하는 습관에 빠져서 경로 이름을 조합해야합니다. 운영 체제가 슬래시 또는 백래쉬를 원하는지 여부를 알고 있으며 이중 백 슬래시를 잊지 않습니다. –

답변

3

xmlJob.close을 입력하면 xmlJob 개체의 close 클래스 메서드를 참조하지만 호출하지는 않습니다.

는 다음을 준수하십시오

f.close를 호출
>>> f = open("tmp.txt") 
>>> f 
<open file 'tmp.py', mode 'r' at 0x7f906e8c5ae0> 
>>> f.close 
<built-in method close of file object at 0x7f906e8c5ae0> 
>>> f 
<open file 'tmp.py', mode 'r' at 0x7f906e8c5ae0> 
>>> f.close() 
>>> f 
<closed file 'tmp.py', mode 'r' at 0x7f906e8c5ae0> 

는 단지 그 방법의 repr esentation 인쇄, 그것을 호출하지 않습니다. with open(x) as y 구조가 syntactic sugar behind the scenesalot을 가지고 있기 때문에 코드의 두 번째 블록이 작동

이유입니다. 예외 처리와 함께 객체의 종료도 깨끗하게 처리합니다. 즉, with 블록 끝에 도달하면 파일을 수동으로 닫을 필요가 없습니다.

+0

와우 나는 바보 야. 나는 십여 번을 훑어 보았고 내가 .close 다음에()를 놓치고 있다는 것을 깨닫지 못했다. Derp. –

+0

@JediWolf 우리 모두가 그럴 때가 있습니다. 나는 내가 자주 ...하는 것을 안다. –

관련 문제