繁体   English   中英

如何在 Python 中逐字节读取文件以及如何将字节列表打印为二进制文件?

[英]How to read a file byte by byte in Python and how to print a bytelist as a binary?

我正在尝试逐字节读取文件,但我不确定该怎么做。 我正在尝试这样做:

file = open(filename, 'rb')
while 1:
   byte = file.read(8)
   # Do something...

那么这是否会使变量字节在每个循环开始时包含 8 个下一位? 这些字节到底是什么并不重要。 唯一重要的是我需要读取 8 位堆栈中的文件。

编辑:

此外,我将这些字节收集在一个列表中,我想打印它们,这样它们就不会打印为 ASCII 字符,而是打印为原始字节,即当我打印该字节列表时,它给出的结果为

['10010101', '00011100', .... ]

要读取一个字节:

file.read(1)

8位是一个字节。

要回答问题的第二部分,要转换为二进制,您可以使用格式字符串ord函数:

>>> byte = 'a'
>>> '{0:08b}'.format(ord(byte))
'01100001'

请注意,格式填充正确的前导零数,这似乎是您的要求。 此方法需要Python 2.6或更高版本。

您显示的代码将读取8 个字节 你可以用

with open(filename, 'rb') as f:
   while 1:
      byte_s = f.read(1)
      if not byte_s:
         break
      byte = byte_s[0]
      ...

有一个python模块专门用于读取和写入称为“ struct ”的二进制编码数据。 由于2.6下的Python版本不支持str.format,因此需要使用自定义方法来创建二进制格式化字符串。

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

晚会,但这可能有助于任何人寻找快速解决方案:

你可以使用bin(ord('b')).replace('b', '') bin()它会在最后一位之后为你提供一个'b'的二进制表示,你必须删除它。 ord()还为char或8位/ 1字节编码字符提供ASCII编号。

干杯

读一个字节?

a = 'a'

byte = a.encode()

format ( byte[0] , '08b' )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM