Python读取文件字节转为Base10并生成列表异常问题求助
读取二进制文件时出现异常十进制值的原因及解决方法
问题描述
我是Python及计算机数据领域新手,使用Python 3.10版本,希望读取名为input.nodes的文件,将每个字节转换为十进制并按顺序存入列表。编写了如下代码:
with open('input.nodes') as f: dataImport = f.read() dataImportSplit = [] # << 初始化空列表用来存储每个字节的十进制值 for chr in dataImport: # << 遍历读取到的内容,把每个字节存入列表 dataImportSplit.append(ord(chr)) print('BYTE LIST (in Base10):\n' + str(dataImportSplit)) # << 打印列表用于调试
代码执行后,列表中多数值为字节的十进制表示,但出现了8364、8250这类异常值,终端输出如下:
BYTE LIST (in Base10): [0, 0, 1, 78, 63, 8364, 0, 0, 255, 112, 8250, 68, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 8364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 31, 31, 31, 255, 127, 127, 127, 255, 127, 127, 127, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 8364, 0, 0, 0, 0, 0, 100, 0, 0, 0, 100, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 45, 0, 0, 0, 45, 255, 112, 8250, 68, 255, 112, 8250, 68, 255, 112, 8250, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
原文件的十六进制内容显示存在连续字节序列,请问我忽略了什么?8364和8250这两个数值是什么原因导致的?
问题原因
你使用文本模式打开了二进制文件,Python会用默认编码(通常是UTF-8)解析文件内容。原文件中的某些字节序列(比如E2 82 AC)是UTF-8编码的多字节字符,会被解析成单个Unicode字符(比如€,对应码点8364);E2 80 BA会被解析成›,对应码点8250。ord()函数返回的是这些Unicode字符的码点,而非原文件里的单个字节值,因此出现了超过255的异常数值。
解决方法
改用二进制模式打开文件,直接读取字节数据。二进制模式下读取的内容是bytes类型,每个元素本身就是0-255的十进制整数,无需使用ord()转换:
with open('input.nodes', 'rb') as f: data_import = f.read() # bytes对象本身可迭代,直接转为列表即可 byte_list = list(data_import) print('BYTE LIST (in Base10):\n', byte_list)
补充说明
- 8364是Unicode字符
€的码点,对应原文件中的三个字节0xE2 0x82 0xAC; - 8250是Unicode字符
›的码点,对应原文件中的三个字节0xE2 0x80 0xBA; - 二进制模式读取能保证获取文件中每个字节的原始十进制值,不会出现编码解析导致的异常。
内容的提问来源于stack exchange,提问作者Vuice
相关产品推荐
相关产品推荐

