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 cat
los 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:
- Archivo original
- HASH: 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
- archivo fusionado por script
- HASH: c3e5a0404da480f36d37b65053732abe6d19034f60c3004a908b88d459db7d87
archivo combinado manualmente usando cat
- HASH: 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
Comando utilizado:
for i in /tmp/pycurl_*_{0..7}; do cat $i >> manually_merged.tar.gz; done
Archivos de pieza : numerados al final, del 0 al 7
open
modo no es correcto (wb
). Sobre la base de stackoverflow.com/a/4388244/3727050 que es necesarioab
(or+b
yseek
)filename
,self.tempfile_arr
yshutil
no están definidosRespuestas:
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 ycat
(que no haría ninguna traducción).Intente ejecutar su script pasando
newline=''
(la cadena vacía) aopen
.fuente