Считывает входной файл как шестнадцатеричный и выводит определенные значения, всегда завершается ошибкой при чтении файла

#python #encoding #hex

#python #кодирование #шестнадцатеричный

Вопрос:

То, что я пытаюсь сделать, это извлечь изображения png из файлов, поэтому, читая шестнадцатеричные данные, легко найти, где они скрыты. Они всегда начинаются и заканчиваются определенными значениями, относящимися к изображениям png. Я написал скрипт, который откроет файл .bin, выполнит поиск этих значений и экспортирует в формате png. Проблема в том, что в python 2.7 ничего не происходит, а в python 3 я получаю ошибки о кодировке файла. Я пробовал ignorerrors и флаги кодировки utf-8, но проблемы все еще сохраняются. Рассматриваемый код:

 import binascii
import re
import os

for directory, subdirectories, files in os.walk('.'):
    for file in files:

        if not file.endswith('.bin'):
            continue

        filenumber = 0

        with open(os.path.join(directory, file)) as f:

            hexaPattern = re.compile(
                r'(89504E47.*?AE426082)',
                re.IGNORECASE
            )

            for match in hexaPattern.findall(binascii.hexlify(f.read())):

                with open('{}-{}.png'.format(file, filenumber), 'wb ') as f:
                    f.write(binascii.unhexlify(match))

                filenumber  = 1
  

Итак, как вы можете видеть, извлеките шестнадцатеричные значения, начинающиеся с «89504E47» из импортированного файла, что-нибудь среднее между этим и «AE426082». Я думаю, что весь код для получения этих значений в порядке, но у меня проблемы с python, фактически считывающим файл как шестнадцатеричный. Мысли?

Комментарии:

1. » Я получаю ошибки — пожалуйста, предоставьте полную обратную трассировку ошибок. Обратите внимание, что вы открываете свой файл в текстовом режиме (по умолчанию). Начните с выполнения этого в двоичном режиме: with open(os.path.join(directory, file), 'b') as f:

2. Вероятно, вам нужно открыть файл в двоичном режиме, чтобы избежать перевода данных в символы Юникода.

Ответ №1:

Спасибо @Thierry Lathuille, который исправил это. Я использовал python 3.9, затем внес изменения с помощью:

with open(os.path.join(directory, file), 'rb ') as f:

и все выводится правильно!