我刚开始使用Python,并希望在文本文件中找到任何给定字符的二进制代码。我遇到的问题是当它打印二进制文件时,二进制文件中有一个“b”。
file = open("textfile.txt","w")
file.write("Hello World ")
file.write("This our new text file")
file.write("and this is another line. ")
file.write("Why? Because we can.")
file.close()
with open("textfile.txt") as file:
data=file.readline()
data_vector = list(data)
binary_data_vector = map(bin, bytearray(data_vector))
print(binary_data_vector)
这是我目前得到的输出:
['0b1001000', '0b1100101', '0b1101100', '0b1101100', '0b1101111', '0b100000', '0b1010111', '0b1101111', '0b1110010', '0b1101100', '0b1100100', '0b100000', '0b1010100', '0b1101000', '0b1101001', '0b1110011', '0b100000', '0b1101111', '0b1110101', '0b1110010', '0b100000', '0b1101110', '0b1100101', '0b1110111', '0b100000', '0b1110100', '0b1100101', '0b1111000', '0b1110100', '0b100000', '0b1100110', '0b1101001', '0b1101100', '0b1100101', '0b1100001', '0b1101110', '0b1100100', '0b100000', '0b1110100', '0b1101000', '0b1101001', '0b1110011', '0b100000', '0b1101001', '0b1110011', '0b100000', '0b1100001', '0b1101110', '0b1101111', '0b1110100', '0b1101000', '0b1100101', '0b1110010', '0b100000', '0b1101100', '0b1101001', '0b1101110', '0b1100101', '0b101110', '0b100000', '0b1010111', '0b1101000', '0b1111001', '0b111111', '0b100000', '0b1000010', '0b1100101', '0b1100011', '0b1100001', '0b1110101', '0b1110011', '0b1100101', '0b100000', '0b1110111', '0b1100101', '0b100000', '0b1100011', '0b1100001', '0b1101110', '0b101110']
所以我的问题是如何摆脱“b”所以它只为每个字符打印8位。如果你知道为什么会这样,请解释!
答案 0 :(得分:1)
bin
函数返回一个数字的二进制表示,前缀为0b
,这使得这种表示直接适用于Python源代码中的输入。
这不是我们大多数时候想要的,所以一个有效的方法是剥离每个字符串的前2个字符。但是bin
还存在另一个问题:它只根据需要编码一个数字位来代表它。这意味着当我们通常需要表示8位时,ASCII字符将被编码为7个二进制数字。
另一种方法是使用字符串格式本身来创建表示。 .format
字符串方法不仅允许您要求打印数字的二进制(而不是十进制)表示,还允许您通过在格式字符串中键入前导零来指定所需的数字位数:
binary_data_vector = ["{:08b}".format(number) for number in bytearray(data_vector)]
(花点时间看看list comprehensions - 它们起初看起来很奇怪,但比使用map
和filter
函数更强大,更具可读性 - 例如上面一行,需要指定一个lambda函数,使用map
来编写它)