1

私は現在、データの読み取りおよび書き込み時に Python 3 がバイトを処理する方法を実験していますが、原因が見つからないように見える特に厄介な問題に遭遇しました。私は基本的にJPEGファイルからバイトを読み取り、を使用して整数に変換しord()、行を使用してバイトを元の文字chr(character).encode('utf-8')に戻し、JPEGファイルに書き戻します。問題ありませんよね?JPEG ファイルを開こうとすると、Windows 8.1 で写真を開けないという通知が表示されます。2 つのファイルを確認すると、1 つは 5.04MB、もう 1 つは 7.63MB で、非常に混乱しています。

def __main__():
    operating_file = open('photo.jpg', 'rb')

    while True:
        data_chunk = operating_file.read(64*1024)
        if len(data_chunk) == 0:
            print('COMPLETE')
            break
        else:
            new_operation = open('newFile.txt', 'ab')
            for character in list(data_chunk):
                new_operation.write(chr(character).encode('utf-8'))


if __name__ == '__main__':
    __main__()

これは私が使用している正確なコードです。何が起こっているのか、どうすれば修正できるのかについてのアイデアはありますか?

注:list(data_chunk)提供される番号のリストは と同等であると想定していますord()

4

2 に答える 2

2

これは、あなたが試してみたいと思うかもしれない簡単な例です:

import sys

f = open('gash.txt', 'rb')
stuff=f.read()    # stuff refers to a bytes object
f.close()

print(stuff)

f2 = open('gash2.txt', 'wb')

for i in stuff:
    f2.write(i.to_bytes(1, sys.byteorder))

f2.close()

ご覧のとおり、bytes オブジェクトは反復可能ですが、forループでは in が返さintiます。それをバイトに変換するには、int.to_bytes()メソッドを使用します。

于 2016-04-16T16:24:36.980 に答える
0

コード ポイントがあり、それを UTF-8 でエンコードすると、結果に元のバイトよりも多くのバイトが含まれる可能性があります。

具体的な例については、WikiPedia のページを参照して、16 進数の値を検討してください0xA2

これは 255 未満の単一のバイナリ値ですが、UTF8 にエンコードすると0xC2, 0xA2.

ソース ファイルからバイトを取得していることを考えると、私の最初の推奨事項は、バイトをターゲット ファイルのライターに直接渡すことです。

ファイル I/O がどのように機能するかを理解しようとしている場合はencode()、バイナリ ファイル モードの使用に注意してください。バイナリ ファイルは、エンコードまたはデコードする必要はありません。バイナリ ファイルは生データです。

于 2016-04-16T16:25:17.840 に答える