2012-07-13 14 views
9

de ekleyebilirsiniz üzerine Aşağıdaki kod var: Ben yeni içerikle dosyada var eski içeriğini değiştirmek istiyorumPython değiştirip yerine

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() 

. Ancak, kodumu çalıştırdığımda, "test.xml" dosyası eklenir, yani eski "değiştirilen" içerik tarafından follwed oldum. Eski şeyleri silmek ve yeni olanı saklamak için ne yapabilirim? http://docs.python.org/library/stdtypes.html?highlight=truncate#file.truncate

Yoksa open(myfile, 'w') kullanın:

+1

http://stackoverflow.com/questions/2424000/read-and-overwrite-a -file-in-python –

cevap

20

Sen yerde yapmak istiyorum değiştirirseniz kesecek kullanmak gerekir. Bu eski dosyayı siler ve yeni bir tane oluşturur.

AFAIK kırpması, inode'u değiştirmez, ancak açık (..., 'w') yeni bir inode oluşturur. Ancak çoğu durumda bu önemli değil. ... şimdi test ettim. Hem açık (..., 'w') hem de truncate(), dosyanın inode numarasını değiştirmez. (Ubuntu 12.04 NFS ve ext4 ile test edilmiştir). Bu, Python ile ilgili değildir. Tercüman, ilgili düşük seviyeli API'yi çağırır. C programlama dilinde aynı şekilde çalışır truncate() yöntemi: çözüm olabilir truncate() kullanma http://man7.org/linux/man-pages/man2/truncate.2.html

+0

Harika, kesik işe yaradı. Teşekkür ederim! – Kaly

0

Bkz

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() 
İlgili konular