无法在Python中读取二进制文件

问题描述

我正在尝试使用以下格式读取二进制文件

with open("binaryfile.bin",'rb') as f1:  
    for line in f1.readlines():  
        print(line) 

它返回类似乱码的数据

@ ç─+@@@d*d)      

⌡Å2

  
q_ Ç        

我已验证文件中的数据正确,并且可以在命令行上使用od命令读取它

od -w8 -Ad -x binaryfile.bin

输出

0000000 0011 0022 0066 0066
0000008 0066 0066 0066 0066
*  
0000032 1234 0000 0000 0000
0000040 0000 0000 0000 0000
* 
0000080 0000 0000 0000 0056
0000088 0011 

'od'命令的问题在于,当两行或多行连续相似时,它将替换为“ * \ n” 。如果我每行仅读取两个字节(因为更多数据是常见的),则此问题会变得更加普遍。

od -w2 -Ad -x binaryfile.bin

输出

0000000 0011
0000002 0022
0000004 0066
*
0000032 1234
0000034 0000
*
0000086 0056
0000088 0011

我想阅读每一行。

Q1:谁能建议为什么正常的'rb'命令不起作用?
Q2:是否可以选择使用'ob'命令读取整个文件而不删除公共行?

解决方法

open("binaryfile.bin",'rb')正常工作,它读取以字节为单位的数据,然后将这些信息打印到控制台,并尝试将这些字节块转换为'utf-8'格式并产生奇怪的字符,因为您不是在读取文本文件。

您可以使用binascii.hexify方法将字节字符串转换为所需的十六进制表示形式:

import binascii

with open("binaryfile.bin",'rb') as f1:  
  for line in f1.readlines():
    # NOTE: arguments 'sep' and 'bytes_per_sep' are only since Python v3.8
    print(binascii.hexlify(line,sep=' ',bytes_per_sep=2))