Comment gérer correctement plusieurs fichiers binaires en python?

10

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 catles 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:

Saumyakanta Sahoo
la source
2
Je pense que votre openmode n'est pas correct ( wb). Basé sur stackoverflow.com/a/4388244/3727050 dont vous avez besoin ab(ou r+bet seek)
urbain
3
Vous devez fournir un exemple reproductible minimal comprenant des exemples de fichiers temporaires. Je pense que vous devriez pouvoir reproduire le problème avec des fichiers temporaires de quelques octets chacun. Espérons que la taille de la mémoire tampon ne fait pas partie du problème. De plus, le mode binaire n'est probablement pas important, vous pouvez donc utiliser des fichiers en texte brut.
wjandrea
FWIW Je n'ai malheureusement pas pu reproduire le problème avec deux fichiers texte très courts sous Linux.
wjandrea
En fait, pycurl nécessite le mode binaire pour écrire des données.
Saumyakanta Sahoo
3
OK, ça reste incomplète les fichiers d' aide , mais votre code: filename, self.tempfile_arret ne shutilsont pas définies
wjandrea

Réponses:

0

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 et cat(qui ne ferait aucune traduction).

Essayez d'exécuter votre script en passant newline=''(la chaîne vide) à open.

Masklinn
la source