2014-01-06 38 views
0

我有一個有趣的問題,我試圖弄清楚。我有一個大的程序,並在該程序的一部分,我正在做一個.xml文件並寫入它(只使用字符串沒有lxml或任何東西)。我將這些特定的代碼放到自己的程序中進行測試,並且遇到了一個問題。該代碼是在python中製作和寫入文件,但不寫或關閉文件

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 

代碼貫穿而過,沒有給我任何錯誤,只是不觸發,但在該文件是由沒有什麼寫在上面。另外,如果不先關閉Python,我不能刪除文件,因此.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') 

運行良好。所以顯然我可以使用with而不是open和.close,但是現在我想弄清楚爲什麼第一個選項失敗。我在其他程序中使用了幾乎完全相同的代碼來寫入日誌文件等。有人有主意嗎?

+2

xmlJob.close without()??? –

+0

你應該習慣使用'os.path.join()'來組裝路徑名。它知道你的操作系統是否需要正斜槓或反斜槓,並且永遠不會忘記雙反斜槓。 –

回答

3

通過鍵入xmlJob.close您引用xmlJob對象上的類方法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> 

調用f.close僅僅打印出方法的repr esentation,並且不調用它。

你的代碼的第二塊工作的原因是因爲with open(x) as y構建具有alotsyntactic sugar behind the scenes。除了異常處理外,它還可以乾淨地處理對象的關閉。這意味着一旦到達with塊的末尾,就不需要手動關閉文件。

+0

哇,我是個白癡。我查了十幾遍,並沒有意識到我錯過了.close之後的()。 DERP。 –

+0

@JediWolf有時候我們都喜歡那樣。我知道我經常......。 – 2014-01-06 23:26:59