我目前正在借助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):
file merged manually using cat
使用的命令:
for i in /tmp/pycurl_*_{0..7}; do cat $i >> manually_merged.tar.gz; done
Part files-末尾编号,从0到7
答案 0 :(得分:0)
使用最小限度可重复的案例很方便,但是我怀疑是universal newlines的问题:默认情况下,如果您的文件是Windows样式的文本(换行符为\r\n
),在阅读时转换为Unix样式的换行符(\n
)。然后,这些unix样式的换行符将被写回到输出文件,而不是您期望的Windows样式的换行符。那将解释python和cat
之间的差异(它们不会进行任何翻译)。
尝试运行将newline=''
(空字符串)传递到open
的脚本。