如何在python中修改文件的二进制状态?

时间:2015-09-21 05:40:14

标签: python binary edit

我现在真的很绝望 无论我怎么努力,搜索和制作不同的剧本,我仍然无法按照我需要的方式修改它 这很简单, 我想读取文件的第一个字节,比如二进制文件00 00 00 10,补充它,使它成为11 11 11 01,然后把它写在它的位置,所以如果文件是两个字节,例如,它会是这样的:

00 00 00 10 #First byte
01 10 10 10  #Second byte

修改后将是:

11 11 11 01 #Complement of the first byte
01 10 10 10  #Second byte remains intact

如果有人能解释我的问题,我们将非常感激。

1 个答案:

答案 0 :(得分:2)

听起来你想要的是读取追加模式。

with open('file', 'r+b') as file:
    data = f.read(1)[0]
    data = (~data) % 256
    file.seek(0)
    file.write(bytes((data,)))

开场模式为r+b。读取r+表示也启用写入,b表示二进制,因此读取的结果是字节对象而不是字符串。

f.read(1)[0]读取文件的第一个字节,并将结果字节对象中的值作为整数提取(字节对象的索引值为整数)

~data是返回字节的否定。由于python没有真正的字节类型,我们使用% 256将结果包装回0-255范围。

file.seek(0)返回文件的开头,以便下一次写入替换第一个字节。 Seek采用字节偏移量。

最后只需将数据写回文件即可。 bytes在0-255范围内采用一系列整数,因此我们将其赋予元组(data,)。或者,我们可以使用整数的to_bytes方法并跳过这样的包装:

with open('file', 'r+b') as file:
    data = f.read(1)[0]
    data = ~data
    file.seek(0)
    file.write(data.to_bytes(1, 'little', signed=True))

Read返回一个bytes对象,该对象是一个字节数组。当您访问一个时,它会将每个索引处的值作为整数返回。要将字节数组转换为单个整数,可以使用int.from_bytes。它的参数是bytes对象,表示字节序的字符串'big''little',以及可选的关键字参数signed,它告诉我们是否将字节解释为有符号。要转换回来,你可以使用.to_bytes这是int对象上的一个方法,该方法有三个参数:要转换的字节数,加上字节序以及是否解释签名数据。

因此,要一次处理多个字节,您可以read不同的字节数。

在读取或写入之前,您可以随时seek到文件中的任何字节偏移量。在尝试搜索或读取之前,您还可以使用file.tell()查找文件中有多少字节。