Python: байты не конвертируются должным образом? - PullRequest
0 голосов
/ 06 марта 2019

Я ОЧЕНЬ новичок в бинарных вещах, и я немного борюсь. Я пытаюсь преобразовать двоичный файл в текст. Пока это мой код:

 with open(file_path, 'rb') as f:
  data = f.read()
  temp_data = str(data)

  if temp_data[-1] == '\\':
    temp_data = temp_data[:-1]

  temp_data = bytes(temp_data, 'utf-8')
  text = temp_data.decode('utf-8')

Кажется, работает ... частично. Я вижу некоторые вещи в длинной байтовой строке, которую я хочу видеть, например, имя файла и метку времени. Тем не менее, я все еще видя много байтовых значений. Значение текстовой переменной:

 b'\x00\x00\x00\x00T\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x004\x01\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00X\x01\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00x\x01\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00TCODEF1001.DAR_MeasLog.2019-03-05+01:10:45.2019-03-05+01:11:21.1.100.0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\xcc}\\\xba\xcc}\\LOG\x00\x00\x00\x00\x00\x00\x00\x00\x00OKL\x00\x04\x00\x00\x00\x01\x00\x00\x00VKL\x00\x05\x00\x00\x00\x01\x00\x00\x00YKL\x00\x06\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00h\xcc}\\\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\xa4\xcc}\\\x02\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00M\x00\x00\x00\x95\xcc}\\\xb9\xcc}\\'

Понятия не имею, как это исправить или что это значит.

Примечание: мне нужно было проанализировать строку для последнего символа '\', потому что декодирование давало мне ошибку «не удалось декодировать, потому что последний символ -« \ »», или что-то в этих строках.

Спасибо!

РЕДАКТИРОВАТЬ: я изменил код, теперь он выглядит так:

 with open(file_path, 'rb') as f:
  data = f.read()

  readable_str = data.decode('utf-16')
  bytes_again = readable_str.encode('utf-16')

Когда я печатаю readable_str, я получаю не-ASCII значения, которые не должны происходить вообще. Я получаю такой текст:

TĴŘŸ䍔䑏䙅〱㄰䐮剁䵟慥䱳杯㈮㄰ⴹ㌰〭⬵㄰ㄺ㨰㔴㈮㄰ⴹ㌰〭⬵㄰ㄺ㨱ㄲㄮㄮ〰〮첕屽첺屽佌G䭏L䭖L䭙L챨屽첤屽M첕屽첹屽

Декодирование не работает с utf-8 или utf-32. Есть ли способ сказать, что декодирование использовать на основе этого? Есть ли другие кодировки, которые я не пробовал? Спасибо!

1 Ответ

0 голосов
/ 06 марта 2019

Подход в Python3 для чтения и записи данных гораздо более явный, чем раньше. Почти всегда принимает байты, декодирует перед работой с данными в скрипте и затем кодирует обратно в байты перед записью.
Я настоятельно рекомендую вам посмотреть в разговоре Недбата о юникоде Python и о том, как правильно работать с байтами ввода / вывода.

Независимо от того, что вы хотите сделать, это

with open('file.txt', 'rb') as fo:
    data = fo.read()  # This is in bytes

# We "decipher" the bytes  into something we can work with
readable_str = data.decode('utf-8')  

bytes_again = readable_str.encode('utf-8')
with open('other_file.txt', 'wb') as fw:
    fw.write(bytes_again)
...