2010-03-02 8 views
9

Dites que j'ai un fichier binaire de 12 Go et je veux trancher 8 Go du milieu de celui-ci. Je connais les indices de position que je veux couper.Python: trancher un très gros fichier binaire

Comment faire? Évidemment, 12 Go ne rentrera pas dans la mémoire, c'est bien, mais 8 Go non plus ... Ce que je pensais bien, mais il semble binaire ne semble pas aimer si vous le faites en morceaux! J'ajoutais 10 Mo à la fois à un nouveau fichier binaire et il y a des discontinuités sur les bords de chaque morceau de 10 Mo dans le nouveau fichier.

Existe-t-il un moyen de faire cela facilement?

Répondre

8

Voici un exemple rapide. Adapter au besoin:

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

Je l'ai fait quelque chose de très similaire que cela et il ne semble pas l'aimer, avec binaire si vous extrayez un bloc de données hors du milieu ne peut pas parfois gâcher les bords car il a besoin de ses octets environnants pour avoir un sens? Hmm. Je vais essayer votre code si acclamations. Avez-vous également obtenu votre longueur et tampon dans le mauvais sens dans la dernière ligne de votre code? –

+0

C'est le début et la longueur ... la dernière ligne utilise la valeur par défaut pour bufsize. Je ne suis pas sûr de ce que vous entendez par «bousiller les bords». Si vous avez besoin d'octets environnants, votre début et votre longueur sont peut-être incorrects? –

+0

Vous avez raison! Je me suis foiré, tout fonctionne maintenant :) Quelle est la taille de tampon optimale pour le transfert de fichiers alors? 1 Mo bon? –

Questions connexes