2012-03-15 18 views
5

Ho incontrato un problema strano quando lavoro con i file in python. Diciamo che ho un file di testo e un semplice pezzo di codice che legge il contenuto del file e quindi lo riscrive con contenuti inalterati.Python legge e scrive aggiungi x00 al file

File.txt

Si tratta di un file di test di codice

Python

f=open(File.txt,'r+') 
data=f.read() 
f.truncate(0) 
f.write(data) 
f.close() 

Dopo aver eseguito il codice di cui sopra File.txt sembra essere lo stesso. Tuttavia, quando l'ho aperto in un editor esadecimale mi ha sorpreso vedere molti dei byte \x00 (NULL) prima del contenuto effettivo del file di testo, che non era.

Qualcuno può spiegare per favore?

risposta

9

Supponiamo che il file contenga 20 byte. Quindi f.read() legge 20 byte. Ora si tronca il file a 0 byte. Ma il tuo puntatore position-in-file è ancora a 20. Perché non dovrebbe essere? Non l'hai spostato. Quindi quando scrivi, inizi a scrivere al 21 ° byte. Il tuo sistema operativo riempie i 20 byte mancanti con zero.

Per evitare questo, f.seek(0) prima di scrivere nuovamente.

1

f.truncate(0) imposta tutti i byte del file su \x00. Tuttavia, non modifica il puntatore del file - sei ancora nella posizione dopo la chiamata a read. Pertanto, se si scrive qualcosa, il sistema operativo estenderà il file alla nuova lunghezza (la lunghezza originale + len(data)).

Per evitare che, chiamare seek:

with open('File.txt', 'r+') as f: 
    data=f.read() 
    f.seek(0) 
    f.truncate(0) 
    f.write(data) 
+0

No, no, no. '.truncate' tronca il file. Questo è tutto; nessun byte null. Se il codice termina con 'f.truncate (0)', il file diventa zero. È il '.write' su un offset di file diverso da zero che fa sì che il sistema operativo riempia i * byte non scritti * con byte null (o semplicemente * presuma * che i byte non scritti siano nulli, dipende dal file system). – tzot

Problemi correlati