3

Pythonで開いたファイルがあり、別の出力ファイルに書き込んでいます。ファイルサイズが16の倍数である必要があるので、これが私が考案したものです。

 with open(input_file, 'rb') as infile:
     with open(output_file, 'wb') as outfile:
         while True:
             input_chunk = infile.read(64)

             if len(input_chunk) == 0:
                 break
             elif len(input_chunk) % 16 > 0:
                 input_chunk.extend([0 for i in range(len(input_chunk) % 16)])

             output_file.write(input_chunk)

残念ながら、ゼロを次のように追加することはできません。

AttributeError: 'str' object has no attribute 'extend'

まず、バイトの配列ではなく、なぜここに文字列があるのですか?バイナリモードでバイナリファイルを読んでいます。

0次に、文字列を処理している場合、その文字列の最後に値を含むバイト数を書き込むにはどうすればよいですか?

4

4 に答える 4

4

Python 2.xでは、strオブジェクトは「バイトの配列」です。

可変配列が必要な場合は、バージョン2.6以降でbytearrayを使用してください。

>>> a = bytearray('my_string')
>>> a.extend(' hello')
>>> str(a)
'my_string hello'

さもないと:

>>> import array
>>> a = array.array('c', 'my_string')
于 2013-02-19T04:20:19.623 に答える
4

まず、バイトの配列ではなく、なぜここに文字列があるのですか?

それが戻ってfile.readくるので...

次に、文字列を扱っている場合、その文字列の最後に値0のバイト数を書き込むにはどうすればよいですか?

文字列は不変であるため、その文字列に書き込むことはできません。ただし、別の文字列に書き込んで、連結によって新しい文字列を作成することはできます。

>>> import struct
>>> input_chunk = 'foo bar baz'
>>> input_chunk + struct.pack('16B',*([0]*16))
'foo bar baz\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> 

64バイトがあることがわかっていて、80バイトにnullが埋め込まれた文字列が必要な場合は、struct.pack 自動的にnullが埋め込まれることに注意してください。

struct.pack('80s',string_of_64_bytes)

's'形式の文字の場合、カウントは文字列のサイズとして解釈され、他の形式の文字のように繰り返しカウントではありません。たとえば、「10s」は単一の10バイト文字列を意味し、「10c」は10文字を意味します。カウントが指定されていない場合、デフォルトで1になります。パッキングの場合、文字列は切り捨てられるか、適切になるように必要に応じてnullバイトが埋め込まれます。解凍の場合、結果の文字列は常に正確に指定されたバイト数になります。特別な場合として、「0s」は単一の空の文字列を意味します(「0c」は0文字を意味します)。

于 2013-02-19T04:20:54.620 に答える
1

使用するだけで、そのまま使用bytearrayできます。

           input_chunk = bytearray(infile.read(64))

[0] * (16 - len(input_chunk)%16)パディングにはリスト内包表記の代わりにのようなものを使用しますが。

于 2013-02-19T04:26:05.283 に答える
0

あなたはinput_chunkこのようにあなたを埋めることができます

input_chunk += '\x00'*(-len(input_chunk)%16)
于 2013-02-19T04:42:51.800 に答える