2017-10-02 2 views
0

Dans le code ci-dessous, nous object et object2 cas être de type « s3.Object » de boto3:Est-ce que download_fileobj() peut ajouter à plutôt que remplacer le fichier de destination?

data = open('out.dat', 'wb') 

object.download_fileobj(data) 
object2.download_fileobj(data) 

Le résultat est que « out.dat » contiendra le contenu de object2 - pas la concaténation de l'objet et object2 comme je m'y attendais. Existe-t-il un moyen d'obtenir download_fileobj() pour ajouter à la destination de téléchargement plutôt que de l'écraser?

La raison pour laquelle j'attendre le résultat est concaténée par analogie avec ceci:

with open('test.file', 'wb') as data: 
    data.write('hello') 
    data.write(' world') 

Le contenu du fichier sont les concaténation des appels « write() ».

Pour rendre les choses encore plus confuses, les rendements après la concaténation des objets S3:

with open('out.dat', 'ab') as data: 
    object.download_fileobj(data) 
    object2.download_fileobj(data) 

Modification du mode de fichier « wb » aux résultats « ab » dans le comportement de concaténation plutôt que le comportement Ecraser. Mais j'aurais pensé que 'ab' vs 'wb' n'auraient aucune différence après l'opération d'ouverture du fichier - ce qui arrive une seule fois - et donc aucun effet sur le résultat (en supposant que 'out.dat' n'existe pas initialement.)

Répondre

2

Est-ce que ce n'est pas ce que le mode ab est pour?

data = open('out.dat', 'wb') 

object.download_fileobj(data) 
data.close(); 

data = open('out.dat','ab'); 
object2.download_fileobj(data) 
data.close(); 

Maintenant data va à la fois les objets.

Espérons que ça aide.

EDIT1:

Cela vaut mieux que si vous exécutez une fois,

with open('out.dat', 'ab') as data: 
    object.download_fileobj(data) 
    object2.download_fileobj(data) 

ab - ouvre en append mode binaire. Une chose dangereuse est le code n'est pas rerunnable.

Si vous l'exécutez à nouveau, il ressemblera à ceci, objet + objet2 + objet + objet2. Fil s'ouvre en mode ajout et tout ce qui est écrit va à la fin du fichier.

+0

En effet, cela fonctionne, mais je dois admettre que je suis confus sur la façon dont il le fait - je vais ajouter plus d'explications dans la question – gcbenison