2012-07-13 7 views
9

Ho il seguente codice:Python sostituire e sovrascrivere invece di aggiungere

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

dove mi piacerebbe sostituire il vecchio contenuto che è nel file con il nuovo contenuto. Tuttavia, quando eseguo il mio codice, viene aggiunto il file "test.xml", cioè il vecchio contenuto follwed dal nuovo contenuto "sostituito". Cosa posso fare per eliminare le cose vecchie e mantenere solo le novità?

+1

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

risposta

20

è necessario utilizzare troncare se si vuole fare sul posto sostituzione: http://docs.python.org/library/stdtypes.html?highlight=truncate#file.truncate

O si utilizza open(myfile, 'w'). Questo cancellerà il vecchio file e ne creerà uno nuovo.

AFAIK troncato non cambia l'inode, ma open (..., 'w') creerà un nuovo inode. Ma nella maggior parte dei casi questo non importa. ... L'ho provato ora. Sia open (..., 'w') che truncate() non cambiano il numero di inode del file. (Testato con Ubuntu 12.04 NFS e ext4).

A proposito, questo non è realmente correlato a Python. L'interprete chiama l'API di basso livello corrispondente. Il metodo truncate() funziona allo stesso modo nel linguaggio di programmazione C: Vedere http://man7.org/linux/man-pages/man2/truncate.2.html

+0

Ottimo, il troncato funzionava. Grazie! – Kaly

0

Utilizzando truncate(), la soluzione potrebbe essere

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