如何使用Python读取带有空字符的二进制文件

如何使用Python读取带有空字符的二进制文件,python,parsing,utf-8,Python,Parsing,Utf 8,我正在尝试读取数据库的二进制文件,并使用python对其进行解析。python从来没有做过这样的事情,我在处理“凌乱”的数据时遇到了一些麻烦。数据中有一堆空值,我不知道如何在不检查空终止符的情况下逐字节读取文件 我如何读取包含所有这些混乱值的文件 我使用这个方法从一个打开的文件缓冲区中获取一个可变的字节数(我不知道这个名称是否正确,但在对文件调用这个函数之前,我已经调用了file=open(file_path,“rb”) def getBytes(self, file, numBytes

我正在尝试读取数据库的二进制文件,并使用python对其进行解析。python从来没有做过这样的事情,我在处理“凌乱”的数据时遇到了一些麻烦。数据中有一堆空值,我不知道如何在不检查空终止符的情况下逐字节读取文件

我如何读取包含所有这些混乱值的文件

我使用这个方法从一个打开的文件缓冲区中获取一个可变的字节数(我不知道这个名称是否正确,但在对文件调用这个函数之前,我已经调用了
file=open(file_path,“rb”)

    def getBytes(self, file, numBytes):

      bArray = file.read(numBytes)
      x=0
      while x < numBytes:

        if (bArray[x] < 32) or (bArray[x] > 126):
          bArray[x] = 32
        x+=1

      charArray = bArray.decode("utf-8")

      self.buffer += numBytes

      return charArray
def getBytes(self、file、numBytes):
bArray=file.read(单位:字节)
x=0
当x126):
bArray[x]=32
x+=1
charArray=bArray.decode(“utf-8”)
self.buffer+=numBytes
返回字符
即使只测试没有特殊字符的uft-8字符串,我也会遇到这个错误。所以这绝对不是一个很好的实现

回溯(最近一次呼叫最后一次):
文件“D:\projects\git\pgdump\u parser\src\python\PG\u Dump\u parser\Source\u Code\main.py”,第3行,在
Sp=Parser.Parser(“./PG\u Dump\u Parser/Data/small\u Data.txt”)
文件“D:\projects\git\pgdump\u parser\src\python\PG\u Dump\u parser\Source\u Code\parser.py”,第17行,在\uuu init中__
self.inData=self.getEntities()
文件“D:\projects\git\pgdump\u parser\src\python\PG\u Dump\u parser\Source\u Code\parser.py”,第66行,在getEntities中
found=self.findNextCREATE(文件)
文件“D:\projects\git\pgdump\u parser\src\python\PG\u Dump\u parser\Source\u Code\parser.py”,第34行,位于findNextCREATE中
byte=self.getBytes(文件,1)
文件“D:\projects\git\pgdump\u parser\src\python\PG\u Dump\u parser\Source\u Code\parser.py”,第97行,以getBytes为单位
打印(“BarrayLD:%s\nx:%s”%(bArray[x],x))

IndexError:bytearray索引超出范围

如果要用空格替换某些字符,使用
translate
方法更容易

(请注意,
self.buffer
应使用实际读取的字节数而不是尝试读取的字节数进行更新。)


代码和回溯之间存在不匹配;代码从未像错误消息报告那样调用
print
。为什么您试图将二进制文件中的二进制字节限制为ASCII,为什么您在这里关心UTF-8?为什么不简单地使用:
def getBytes(self、file、numBytes):self.buffer+=numBytes bArray=file.read(numBytes)return bArray
注释中的代码格式不正确,但应该足以让您理解我的意思。
not_printable_ascii = bytes(range(32)) + bytes(range(127, 256))
spaces = b' ' * len(non_printable_ascii)
trans_table = bytes.maketrans(not_printable_ascii, spaces)

def getBytes(self, file, numBytes):
    bArray = file.read(numBytes)
    self.buffer += len(bArray)
    return bArray.translate(trans_table).decode("utf-8")