2010-03-02 21 views
9

Digamos que tengo un archivo binario de 12GB y quiero cortar 8GB del medio. Sé los índices de posición que quiero cortar.Python: cortar un archivo binario muy grande

¿Cómo puedo hacer esto? Obviamente, 12 GB no encajarán en la memoria, está bien, pero 8 GB tampoco ... Lo cual pensé que estaba bien, ¡pero parece que a binario no parece gustarle que lo haga en pedazos! Estaba agregando 10MB a la vez a un nuevo archivo binario y hay discontinuidades en los bordes de cada fragmento de 10MB en el nuevo archivo.

¿Hay alguna manera Pythonic de hacer esto fácilmente?

Respuesta

8

Aquí hay un ejemplo rápido. Adaptar según sea necesario:

def copypart(src,dest,start,length,bufsize=1024*1024): 
    with open(src,'rb') as f1: 
     f1.seek(start) 
     with open(dest,'wb') as f2: 
      while length: 
       chunk = min(bufsize,length) 
       data = f1.read(chunk) 
       f2.write(data) 
       length -= chunk 

if __name__ == '__main__': 
    GIG = 2**30 
    copypart('test.bin','test2.bin',1*GIG,8*GIG) 
+0

hice algo muy parecido a esto y no parecía que le gustaba, con binario si se extrae un bloque de datos de en medio no puede a veces meter la pata en los bordes ya que necesita los bytes que lo rodean para tener sentido? Hmm. Voy a probar tu código a través de aplausos. ¿También obtuviste tu longitud y memoria intermedia al revés en la última línea de tu código? –

+0

Eso es inicio y duración ... la última línea usa el valor predeterminado para bufsize. No estoy seguro de lo que quiere decir con "ensuciarse en los bordes". Si necesita bytes circundantes, ¿su inicio y longitud son incorrectos? –

+0

¡Estás en lo correcto! Me equivoqué, todo funciona ahora :) Entonces, ¿cuál es el tamaño de búfer óptimo para la transferencia de archivos? 1MB bueno? –

Cuestiones relacionadas