Как использовать Python для чтения двоичного файла с символами NULL - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь прочитать двоичный файл базы данных и проанализировать его, используя python.Никогда не делал ничего подобного с питоном, и у меня проблемы с "грязными" данными.Есть несколько значений NULL в данных, и я не уверен, как читать файлы побайтно, не проверяя терминатор NULL.

Как я могу прочитать этот файл со всеми этими грязными значениями в нем?

Я использовал этот метод, чтобы получить переменное число байтов из открытого файлового буфера (я не знаю, правильное ли это имя, но я бы уже вызвал 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

Я также получаю эту ошибку, даже когда проверяю только строку символов uft-8 без специальных символов. Так что это определенно не очень хорошая реализация.

Traceback (most recent call last): File "D:\projects\git\pgdump_parser\src\python\PG_Dump_Parser\Source_Code\main.py", line 3, in <module> Sp = Parser.Parser("./PG_Dump_Parser/Data/small_data.txt") File "D:\projects\git\pgdump_parser\src\python\PG_Dump_Parser\Source_Code\Parser.py", line 17, in __init__ self.inData = self.getEntities() File "D:\projects\git\pgdump_parser\src\python\PG_Dump_Parser\Source_Code\Parser.py", line 66, in getEntities found = self.findNextCREATE(file) File "D:\projects\git\pgdump_parser\src\python\PG_Dump_Parser\Source_Code\Parser.py", line 34, in findNextCREATE byte = self.getBytes(file, 1) File "D:\projects\git\pgdump_parser\src\python\PG_Dump_Parser\Source_Code\Parser.py", line 97, in getBytes print("bArrayOld: %s \nx: %s" % (bArray[x], x)) IndexError: bytearray index out of range

1 Ответ

0 голосов
/ 29 мая 2018

Если вы хотите заменить определенные символы пробелами, проще использовать метод translate.

(Обратите внимание, что self.buffer должно быть обновлено с количеством байтов, которое вы на самом деле *)1006 * прочитано, а не количество байтов, которое вы попытались прочитать.)

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...