将字节追加到字符串?

Naf*_*Kay 2 python binary file python-2.7

我有一个在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)
Run Code Online (Sandbox Code Playgroud)

不幸的是,它无法将零附加到:

AttributeError: 'str' object has no attribute 'extend'
Run Code Online (Sandbox Code Playgroud)

首先,为什么我在这里有一个字符串,而不是一个字节数组?我正在以二进制模式读取二进制文件。

其次,如果我正在处理一个字符串,我该如何0在该字符串的末尾写入一些带有该值的字节?

mgi*_*son 5

首先,为什么我在这里有一个字符串,而不是一个字节数组?

因为那才是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'
>>> 
Run Code Online (Sandbox Code Playgroud)

请注意,如果您知道自己有64个字节,并且想要一个80字节的字符串,并用null填充,struct.pack 则将使用null自动填充它

struct.pack('80s',string_of_64_bytes)
Run Code Online (Sandbox Code Playgroud)

对于's'格式字符,该计数被解释为字符串的大小,而不是像其他格式字符一样的重复计数。例如,“ 10s”表示一个10字节的字符串,而“ 10c”表示10个字符。如果未提供计数,则默认为1。对于打包,将适当地将字符串截断或填充空字节以使其适合。对于解压缩,结果字符串始终具有完全指定的字节数。在特殊情况下,“ 0s”表示单个空字符串(而“ 0c”表示0个字符)。