2012-07-13 57 views
9

我有以下代碼:Python的替代和覆蓋,而不是附加

import re 
#open the xml file for reading: 
file = open('path/test.xml','r+') 
#convert to string: 
data = file.read() 
file.write(re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>",r"<xyz>ABC</xyz>\1<xyz>\2</xyz>",data)) 
file.close() 

,我想,以取代舊的內容與新內容的文件中。但是,當我執行我的代碼時,會附加文件「test.xml」,即我有舊的內容,並且新的「替換」內容。我能做些什麼來刪除舊的東西,只保留新的東西?

+1

http://stackoverflow.com/questions/2424000/read-and-overwrite-a python – 2012-07-13 11:06:35

回答

20

您需要使用,如果你想在地方做替代截斷:http://docs.python.org/library/stdtypes.html?highlight=truncate#file.truncate

或者你用open(myfile, 'w')。這將刪除舊文件並創建一個新文件。

AFAIK截斷不會改變的inode,但開(..., 'W')將創建一個新的索引節點。但在大多數情況下,這並不重要。 ...我現在測試它。 open(...,'w')和truncate()都不會更改文件的inode編號。 (使用Ubuntu 12.04 NFS和ext4進行測試)。

順便說一句,這是不是真的涉及到Python。解釋器調用相應的低級API。 truncate()工作在C編程語言相同的方法:見http://man7.org/linux/man-pages/man2/truncate.2.html

+0

很好,截斷工作。謝謝! – Kaly 2012-07-13 11:25:20

0

使用truncate(),該解決方案可

import re 
#open the xml file for reading: 
with open('path/test.xml','r+') as f: 
    #convert to string: 
    data = f.read() 
    f.seek(0) 
    f.write(re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>",r"<xyz>ABC</xyz>\1<xyz>\2</xyz>",data)) 
    f.truncate() 
    f.close() 
相關問題