我有一个用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
的字节数写入该字符串的末尾?
答案 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)