Pythonで複数のバイナリファイルを適切に処理する方法


10

私は現在PycURLモジュールの助けを借りてマルチスレッドダウンローダーに取り組んでいます。ファイルの一部をダウンロードして、後でマージします。

パーツは複数のスレッドから個別にダウンロードされ、バイナリモードで一時ファイルに書き込まれますが、それらを単一のファイルにマージすると(正しい順序でマージされます)、チェックサムが一致しません。

これはLinux環境でのみ発生します。同じスクリプトが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()もメソッドを試しました が、同じ問題が発生し、大きなファイルには大量のメモリが必要になります。

catLinuxでパーツファイルを手動で1つのファイルにしてから、ファイルのチェックサムが一致する場合、問題はpythonによるファイルのマージにあります。

編集:
問題を再現するために使用したファイルとチェックサム(sha256)は次のとおりです。


2
あなたのopenモードは正しくないと思います(wb)。基づいてstackoverflow.com/a/4388244/3727050あなたが必要とするab(またはr+bseek
都市

3
いくつかのサンプル一時ファイルを含む、最小限の再現可能なサンプルを提供する必要があります。それぞれ数バイトの一時ファイルで問題を再現できるはずです。うまくいけば、バッファサイズは問題の一部ではありません。また、バイナリモードはおそらく重要ではないため、プレーンテキストファイルを使用できます。
wjandrea

FWIW Linuxで2つの非常に短いテキストファイルを使用して問題を再現できませんでした。
wjandrea

実際、pycurlはデータを書き込むためにバイナリモードを必要とします。
Saumyakanta Sahoo

3
OK、ファイルのヘルプが、あなたのコードが不完全まだだ: filenameself.tempfile_arr、およびshutil不定です
wjandrea

回答:


0

最小限の再現可能なケースが便利ですが、私は普遍的な改行が問題であると思います:デフォルトでは、ファイルがWindowsスタイルのテキスト(改行は\r\n)の場合、Unixスタイルの改行(\n)に変換されます読書。そして、それらのunixスタイルの改行は、期待していたWindowsスタイルのものではなく、出力ファイルに書き戻されます。それはpythonとの間の相違を説明するでしょうcat(翻訳をまったく行わない)のます。

newline=''(空の文字列)をに渡してスクリプトを実行してみてくださいopen

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.