将字节附加到字符串?

时间:2013-02-19 04:13:47

标签: python file python-2.7 binary

我有一个用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 个答案:

答案 0 :(得分: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'
>>> 

请注意,如果您知道您有64个字节,并且您希望使用空值填充80字节的字符串,struct.pack 将使用空值自动填充

struct.pack('80s',string_of_64_bytes)
  

对于's'格式字符,count被解释为字符串的大小,而不是像其他格式字符那样的重复计数;例如,'10s'表示单个10字节字符串,而'10c'表示10个字符。如果未给出计数,则默认为1.对于打包,字符串将被截断或填充为适当的空字节以使其适合。对于解包,生成的字符串始终具有指定的字节数。作为一种特殊情况,'0s'表示单个空字符串(而'0c'表示0个字符)。

答案 1 :(得分:2)

在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')

答案 2 :(得分:1)

只需使用bytearray,您应该保持原样:

           input_chunk = bytearray(infile.read(64))

虽然我只是使用类似[0] * (16 - len(input_chunk)%16)的内容而不是列表推导来填充。

答案 3 :(得分:0)

您可以像这样填充input_chunk

input_chunk += '\x00'*(-len(input_chunk)%16)