You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:35:25