2009-06-18 10 views
12

Estoy tratando de dividir un archivo xml grande en trozos más pequeños. Escribo en el archivo de salida y luego verifico su tamaño para ver si pasó un umbral, pero no creo que el método getsize() esté funcionando como se esperaba.Después de escribir en un archivo, ¿por qué os.path.getsize aún devuelve el tamaño anterior?

¿Cuál sería una buena forma de obtener el tamaño del archivo de un archivo que está cambiando de tamaño?

que he hecho algo como esto ...

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

ejecutar este imprime 0 como el tamaño del archivo de alrededor de 80 iteraciones y luego 4176. ¿El pitón almacenar la salida en un búfer antes de darle salida en realidad?

Respuesta

9

Sí, Python está almacenando en búfer su salida. Usted sería mejor seguir el tamaño sí mismo, algo como esto:

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

(Esto puede no ser fiable al 100%, por ejemplo, en Windows cada línea ganarán un byte por el separador \r\n línea, pero. debería ser lo suficientemente bueno como para dividirlo en pedazos.)

+0

Gracias! Eso debería funcionar. No lo necesito para ser 100% exacto. – Maulin

3

El seguimiento del tamaño usted mismo estará bien para su caso. Una forma diferente sería la de eliminar los archivos de memoria intermedia antes de comprobar el tamaño:

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

Hacer que con demasiada frecuencia se ralentizará archivo de E/S, por supuesto.

5

Ha intentado reemplazar os.path.getsize con os.tell, así:

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

tamaño del archivo es diferente de la posición del archivo. Por ejemplo,

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

Devuelve exactamente el tamaño del archivo en bytes.

Pero

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

Aquí f.tell() devuelve la posición actual del controlador de archivo - es decir, cuando la siguiente escritura pondrá sus datos. Dado que conoce el almacenamiento en búfer, debe ser preciso siempre que simplemente anexe al archivo de salida.

1

Para hallar el desplazamiento hasta el final de un archivo:

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

ejemplo del mundo real - leer las actualizaciones en un archivo e imprimirlos a medida que ocurren:

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 
Cuestiones relacionadas