如何在python中正确处理多个二进制文件?

时间:2019-12-28 16:23:58

标签: python pycurl

我目前正在借助PycURL模块开发多线程下载器。我正在下载文件的一部分,然后将它们合并。

这些部分是从多个线程中分别下载的,它们以二进制模式写入临时文件,但是当我将它们合并为单个文件(它们以正确的顺序合并)时,校验和不匹配。

这仅在linux env中发生。相同的脚本在Windows env中可以完美地工作。

这是合并文件的代码(脚本的一部分):

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

我也尝试了write()方法,但是结果同样存在问题,并且大型文件将占用大量内存。

如果我手动将零件文件cat放入Linux中的单个文件,然后文件的校验和匹配,则问题出在python的文件合并中。

编辑:
这是我用来重现该问题的文件和校验和(sha256):

  • Original file
    • 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
  • file merged by script
    • c3e5a0404da480f36d37b65053732abe6d19034f60c3004a908b88d459db7d87
  • file merged manually using cat

    • 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
    • 使用的命令:

      for i in /tmp/pycurl_*_{0..7}; do cat $i >> manually_merged.tar.gz; done
      
  • Part files-末尾编号,从0到7

1 个答案:

答案 0 :(得分:0)

使用最小限度可重复的案例很方便,但是我怀疑是universal newlines的问题:默认情况下,如果您的文件是Windows样式的文本(换行符为\r\n),在阅读时转换为Unix样式的换行符(\n)。然后,这些unix样式的换行符将被写回到输出文件,而不是您期望的Windows样式的换行符。那将解释python和cat之间的差异(它们不会进行任何翻译)。

尝试运行将newline=''(空字符串)传递到open的脚本。