¿Cómo manejar adecuadamente múltiples archivos binarios en python?

10

Actualmente estoy trabajando en un descargador multiproceso con la ayuda del módulo PycURL. Estoy descargando partes de los archivos y fusionándolos después.

Las partes se descargan por separado de varios subprocesos, se escriben en archivos temporales en modo binario, pero cuando las fusiono en un solo archivo (se fusionan en el orden correcto), las sumas de verificación no coinciden.

Esto solo ocurre en linux env. El mismo script funciona a la perfección en Windows env.

Este es el código (parte del script) que combina los archivos:

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!')

También probé el write()método, pero resulta con el mismo problema, y ​​tomará mucha memoria para archivos grandes.

Si manualmente catlos archivos de pieza en un solo archivo en Linux, entonces la suma de comprobación del archivo coincide, el problema es con la fusión de archivos de Python.

EDITAR:
Aquí están los archivos y sumas de comprobación (sha256) que utilicé para reproducir el problema:

Saumyakanta Sahoo
fuente
2
Creo que tu openmodo no es correcto ( wb). Sobre la base de stackoverflow.com/a/4388244/3727050 que es necesario ab(o r+by seek)
urbana
3
Debe proporcionar un ejemplo reproducible mínimo que incluya algunos archivos temporales de ejemplo. Creo que debería poder reproducir el problema con algunos archivos temporales de solo unos pocos bytes cada uno. Esperemos que el tamaño del búfer no sea parte del problema. Además, el modo binario probablemente no sea importante, por lo que podría usar archivos de texto sin formato.
wjandrea
FWIW Lamentablemente, no pude reproducir el problema con dos archivos de texto muy cortos en Linux.
wjandrea
En realidad, pycurl requiere modo binario para escribir datos.
Saumyakanta Sahoo
3
Aceptar, los archivos de ayuda, pero su código es aún incompleta: filename, self.tempfile_arry shutilno están definidos
wjandrea

Respuestas:

0

Sería conveniente un caso mínimamente reproducible, pero sospecho que el problema son las nuevas líneas universales : de forma predeterminada, si sus archivos son texto de estilo Windows (las líneas nuevas \r\n) se traducirán a líneas nuevas de estilo Unix ( \n) en leyendo. Y luego esas nuevas líneas de estilo Unix se volverán a escribir en el archivo de salida en lugar de las de estilo Windows que esperabas. Eso explicaría la divergencia entre python y cat(que no haría ninguna traducción).

Intente ejecutar su script pasando newline=''(la cadena vacía) a open.

Masklinn
fuente