web-dev-qa-db-fra.com

Écriture d'un objet BytesIO dans un fichier, «efficacement»

Donc, un moyen rapide d'écrire un objet BytesIO dans un fichier serait d'utiliser simplement:

with open('myfile.ext', 'wb') as f:
    f.write(myBytesIOObj.getvalue())
myBytesIOObj.close()

Cependant, si je voulais parcourir le myBytesIOObj plutôt que de l'écrire en un seul morceau, comment pourrais-je m'y prendre? Je suis sur Python 2.7.1. De plus, si le BytesIO est énorme, serait-ce un moyen plus efficace d'écrire par itération?

Merci

18
Kalabaaz

shutil possède un utilitaire qui écrit le fichier efficacement. Il copie en morceaux, par défaut à 16K. Tout multiple de morceaux 4K doit être un bon numéro multiplateforme. J'ai choisi 131072 plutôt arbitrairement parce que vraiment le fichier est écrit dans le cache du système d'exploitation en RAM avant d'aller sur le disque et la taille du morceau n'est pas si grave.

import shutil

myBytesIOObj.seek(0)
with open('myfile.ext', 'wb') as f:
    shutil.copyfileobj(myBytesIOObj, f, length=131072)

BTW, il n'était pas nécessaire de fermer l'objet fichier à la fin. with définit une étendue, et l'objet fichier est défini à l'intérieur de cette étendue. Le descripteur de fichier se ferme donc automatiquement à la sortie du bloc with.

23
tdelaney