如何修改 python 中文件的二进制状态?
How to modify a binary state of a file in python?
我现在真的很绝望
无论我多么努力地尝试、搜索和制作不同的脚本,我仍然无法按照我需要的方式修改它。
这很简单,
我想读取一个文件的第一个字节,以二进制表示它是 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
如果有人能阐明我的问题,我将不胜感激。
听起来你想要的是read-append模式。
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)
returns 到文件的开头,以便下一次写入替换第一个字节。寻求以字节为单位的偏移量。
最后把数据写回文件。 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))
读取returns一个bytes
对象,它是一个字节数组。当您访问一个时,它 returns 每个索引处的值作为整数。要将字节数组转换为单个整数,您可以使用 int.from_bytes
。它的参数是 bytes 对象,一个字符串 'big'
或 'little'
指示字节顺序,以及一个可选的关键字参数 signed
,它告诉是否将字节解释为带符号或不带符号。要转换回来,您可以使用 .to_bytes
这是 int
对象上的一个方法,它接受三个参数:要转换为的字节数、字节顺序以及是否解释签名数据。
因此,要一次处理多个字节,您可以 read
不同数量的字节。
您可以在读取或写入之前随时seek
到文件中的任何字节偏移量。在尝试查找或读取之前,您还可以使用 file.tell()
找出文件中有多少字节。
我现在真的很绝望
无论我多么努力地尝试、搜索和制作不同的脚本,我仍然无法按照我需要的方式修改它。
这很简单,
我想读取一个文件的第一个字节,以二进制表示它是 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
如果有人能阐明我的问题,我将不胜感激。
听起来你想要的是read-append模式。
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)
returns 到文件的开头,以便下一次写入替换第一个字节。寻求以字节为单位的偏移量。
最后把数据写回文件。 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))
读取returns一个bytes
对象,它是一个字节数组。当您访问一个时,它 returns 每个索引处的值作为整数。要将字节数组转换为单个整数,您可以使用 int.from_bytes
。它的参数是 bytes 对象,一个字符串 'big'
或 'little'
指示字节顺序,以及一个可选的关键字参数 signed
,它告诉是否将字节解释为带符号或不带符号。要转换回来,您可以使用 .to_bytes
这是 int
对象上的一个方法,它接受三个参数:要转换为的字节数、字节顺序以及是否解释签名数据。
因此,要一次处理多个字节,您可以 read
不同数量的字节。
您可以在读取或写入之前随时seek
到文件中的任何字节偏移量。在尝试查找或读取之前,您还可以使用 file.tell()
找出文件中有多少字节。