Python 以十六进制形式读取输入文件并输出某些值,读取文件时总是失败

Python 以十六进制形式读取输入文件并输出某些值,读取文件时总是失败,python,encoding,hex,Python,Encoding,Hex,我想做的是从文件中提取png图像,这样通过读取十六进制数据就很容易找到它们隐藏的地方。它们总是以特定的png图像值开始和结束。我编写了一个脚本,可以打开一个.bin文件,搜索这些值并导出为png。问题是,在Python2.7中什么都没有发生,而在Python3中,我得到了关于文件编码的错误。我尝试过ignorerrors和utf-8编码标志,但问题仍然存在。有关守则: import binascii import re import os for directory, subdirectori

我想做的是从文件中提取png图像,这样通过读取十六进制数据就很容易找到它们隐藏的地方。它们总是以特定的png图像值开始和结束。我编写了一个脚本,可以打开一个.bin文件,搜索这些值并导出为png。问题是,在Python2.7中什么都没有发生,而在Python3中,我得到了关于文件编码的错误。我尝试过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将文件读取为十六进制时遇到了问题。想法?

谢谢你@Thierry Lathuille解决了这个问题。我使用了python 3.9,然后进行了以下更改:

打开(os.path.join(目录,文件),'rb+')作为f:


所有输出都正确

“我收到错误-请提供完整的错误回溯。请注意,您正在以文本模式(默认模式)打开文件。首先,请以二进制模式执行此操作:
打开(os.path.join(directory,file),'b'),如f:
您可能需要以二进制模式打开文件,以避免将数据转换为Unicode字符。”。