Je travaille actuellement sur un téléchargeur multi-thread avec l'aide du module PycURL. Je télécharge des parties des fichiers et les fusionne ensuite.
Les parties sont téléchargées séparément à partir de plusieurs threads, elles sont écrites dans des fichiers temporaires en mode binaire, mais lorsque je les fusionne en un seul fichier (elles sont fusionnées dans le bon ordre), les sommes de contrôle ne correspondent pas.
Cela ne se produit que dans Linux Env. Le même script fonctionne parfaitement dans Windows env.
C'est le code (partie du script) qui fusionne les fichiers:
with open(filename,'wb') as outfile:
print('Merging temp files ...')
for tmpfile in self.tempfile_arr:
with open(tmpfile, 'rb') as infile:
shutil.copyfileobj(infile, outfile)
print('Done!')
J'ai également essayé la write()
méthode, mais elle entraîne le même problème et il faudra beaucoup de mémoire pour les gros fichiers.
Si j'utilise manuellement cat
les fichiers de pièces dans un seul fichier sous Linux, la somme de contrôle du fichier correspond alors, le problème est lié à la fusion de fichiers par Python.
EDIT:
Voici les fichiers et les sommes de contrôle (sha256) que j'ai utilisés pour reproduire le problème:
- Fichier d'origine
- HASH: 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
- fichier fusionné par script
- HASH: c3e5a0404da480f36d37b65053732abe6d19034f60c3004a908b88d459db7d87
fichier fusionné manuellement à l'aide de cat
- HASH: 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
Commande utilisée:
for i in /tmp/pycurl_*_{0..7}; do cat $i >> manually_merged.tar.gz; done
Fichiers pièce - numérotés à la fin, de 0 à 7
open
mode n'est pas correct (wb
). Basé sur stackoverflow.com/a/4388244/3727050 dont vous avez besoinab
(our+b
etseek
)filename
,self.tempfile_arr
et neshutil
sont pas définiesRéponses:
Un cas peu reproductible serait pratique, mais je soupçonne que les sauts de ligne universels sont le problème: par défaut, si vos fichiers sont du texte de style Windows (les sauts de ligne le sont
\r\n
), ils vont être traduits en sauts de ligne de style Unix (\n
) sur en train de lire. Et puis ces nouvelles lignes de style Unix vont être réécrites dans le fichier de sortie plutôt que celles de style Windows que vous attendiez. Cela expliquerait la divergence entre python etcat
(qui ne ferait aucune traduction).Essayez d'exécuter votre script en passant
newline=''
(la chaîne vide) àopen
.la source