我正在尝试逐字节读取文件,但我不知道该怎么做。我试着这样做:
file = open(filename, 'rb')
while 1:
byte = file.read(8)
# Do something...
那么这会使变量字节在每个循环开始时包含8个下一位吗?这些字节究竟是什么并不重要。唯一重要的是我需要读取8位堆栈中的文件。
编辑:
此外,我在列表中收集这些字节,我想打印它们,以便它们不会打印为ASCII字符,而是作为原始字节打印,即当我打印该字符时,它会将结果显示为
['10010101', '00011100', .... ]
答案 0 :(得分:35)
读取一个字节:
file.read(1)
8位是一个字节。
答案 1 :(得分:19)
要回答问题的第二部分,要转换为二进制文件,您可以使用format string和ord
函数:
>>> byte = 'a'
>>> '{0:08b}'.format(ord(byte))
'01100001'
请注意,格式会填充正确数量的前导零,这似乎是您的要求。此方法需要Python 2.6或更高版本。
答案 2 :(得分:15)
您显示的代码将读取8 字节。你可以用
with open(filename, 'rb') as f:
while 1:
byte_s = f.read(1)
if not byte_s:
break
byte = byte_s[0]
...
答案 3 :(得分:2)
有一个python模块,专门用于读取和写入称为“struct”的二进制编码数据。 由于2.6下的Python版本不支持str.format,因此需要使用custom method来创建二进制格式化的字符串。
import struct
# binary string
def bstr(n): # n in range 0-255
return ''.join([str(n >> x & 1) for x in (7,6,5,4,3,2,1,0)])
# read file into an array of binary formatted strings.
def read_binary(path):
f = open(path,'rb')
binlist = []
while True:
bin = struct.unpack('B',f.read(1))[0] # B stands for unsigned char (8 bits)
if not bin:
break
strBin = bstr(bin)
binlist.append(strBin)
return binlist
答案 4 :(得分:0)
晚会,但这可能有助于任何寻求快速解决方案的人:
您可以使用bin(ord('b')).replace('b', '')
bin()它为您提供带有' b'的二进制表示。在最后一点之后,你必须删除它。此外,ord()为您提供了char或8位/ 1字节编码字符的ASCII编号。
干杯