2009-06-18 11 views
12

Sto provando a dividere un grande file xml in blocchi più piccoli. Scrivo sul file di output e poi ne controllo le dimensioni per vedere se ha superato una soglia, ma non penso che il metodo getsize() funzioni come previsto.Dopo aver scritto su un file, perché os.path.getsize restituisce ancora la dimensione precedente?

Quale sarebbe un buon modo per ottenere il file di un file che sta cambiando di dimensioni.

Ive fatto qualcosa di simile ...

import string 
import os 

f1 = open('VSERVICE.xml', 'r') 
f2 = open('split.xml', 'w') 

for line in f1: 
    if str(line) == '</Service>\n': 
    break 
    else: 
    f2.write(line) 
    size = os.path.getsize('split.xml') 
    print('size = ' + str(size)) 

l'esecuzione di questo stampa 0 come la dimensione del file per circa 80 iterazioni e poi 4176. fa Python memorizzare l'output in un buffer prima realmente emetterlo?

risposta

9

Sì, Python sta eseguendo il buffering dell'output. Faresti meglio a seguire il formato da soli, qualcosa di simile:

size = 0 
for line in f1: 
    if str(line) == '</Service>\n': 
    break 
    else: 
    f2.write(line) 
    size += len(line) 
    print('size = ' + str(size)) 

(Che potrebbe non essere accurato al 100%, ad esempio, su Windows ogni riga otterranno un byte a causa del separatore \r\n linea, ma esso. dovrebbe essere sufficiente per un semplice chunking.)

+0

Grazie! Questo dovrebbe funzionare Non ho bisogno che sia accurato al 100%. – Maulin

3

Monitorare la dimensione da soli andrà bene per il tuo caso. Un modo diverso sarebbe quello di svuotare i buffer di file poco prima di controllare la dimensione:

f2.write(line) 
f2.flush() # <-- buffers are written to disk 
size = os.path.getsize('split.xml') 

Facendo che troppo spesso rallenta file di I/O, naturalmente.

5

hai provato a sostituire il os.path.getsize con os.tell, in questo modo:

f2.write(line) 
size = f2.tell() 
11

dimensione del file è diverso dalla posizione del file. Ad esempio,

os.path.getsize('sample.txt') 

Restituisce esattamente la dimensione del file in byte.

Ma

f = open('sample.txt') 
print f.readline() 
f.tell() 

Qui f.tell() restituisce la posizione corrente del gestore di file - vale a dire dove la prossima scrittura metterà i suoi dati. Dal momento che è a conoscenza del buffering, dovrebbe essere accurato purché si acceda semplicemente al file di output.

1

Per trovare l'offset alla fine di un file:

file.seek(0,2) 
print file.tell() 

esempio del mondo reale - leggere gli aggiornamenti in un file e stamparle come accadono:

file = open('log.txt', 'r') 
#find inital End Of File offset 
file.seek(0,2) 
eof = file.tell() 
while True: 
    #set the file size agian 
    file.seek(0,2) 
    neweof = file.tell() 
    #if the file is larger... 
    if neweof > eof: 
     #go back to last position... 
     file.seek(eof) 
     # print from last postion to current one 
     print file.read(neweof-eof), 
     eof = neweof 
Problemi correlati