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

np.loadtxt读取文本文件报错:无法将字符串'\x00'转换为浮点数

报错原因

报错里的\x00是ASCII码值为0的空字符,不属于合法的数值文本内容,numpy.loadtxt默认按纯ASCII/UTF-8编码解析文件、尝试把内容转成浮点数时,遇到这个无法识别的字符就会抛出该ValueError。
这类问题在读取实验设备导出的测量数据时非常常见,核心诱因通常是以下几种:

  • 最普遍的原因是文件编码不匹配:多数光束分析仪、工业相机导出的刃边测量数据文件默认用UTF-16(多为UTF-16-LE)编码保存,这类编码下每个数字、标点占2个字节,普通数字、逗号的高位字节值全为0,按默认编码读取时就会解析出大量\x00字符
  • 文件导出过程异常损坏,或者设备自动在文件头、文件尾追加了带空字节的冗余标识内容
  • 你设置的skiprows=3参数和实际文件表头行数不匹配,未跳过的表头行里混有空字节内容
解决方法

按操作成本从低到高选以下方案即可:

  1. 修改代码兼容带空字节的文件(推荐,不用改动原始数据)
    不要直接把文件名传给np.loadtxt,先手动打开文件、过滤掉所有空字节后,再把清理后的内容传给loadtxt解析。
    首先在代码开头的导入部分加一行:
    from io import StringIO
    
    然后把原来读取垂直数据的代码:
    pixel,gray = np.loadtxt('vert1.txt',skiprows=3,unpack=True,delimiter=',')
    
    替换为:
    with open('vert1.txt', 'r', encoding='utf-16-le') as f:
        clean_text = f.read().replace('\x00', '')
    pixel,gray = np.loadtxt(StringIO(clean_text), skiprows=3, unpack=True, delimiter=',')
    
    读取水平数据的代码做同样修改:
    with open('horiz1.txt', 'r', encoding='utf-16-le') as f:
        clean_text_h = f.read().replace('\x00', '')
    pixel,gray_1 = np.loadtxt(StringIO(clean_text_h), skiprows=3, unpack=True, delimiter=',')
    
    *如果用utf-16-le编码读取后出现乱码,把open里的encoding参数换成utf-16或者utf-8-sig重试即可,绝大多数设备导出的文件用utf-16-le都能正常解析。
  2. 手动清理源文件
    用Notepad++等纯文本编辑器打开两个txt文件,查看右下角显示的文件编码,如果显示为UTF-16,直接在编码菜单里选择「转为UTF-8无BOM编码」后保存;也可以直接把文件里的所有数值内容复制,新建一个空白txt文件粘贴后保存,用新文件替换原来的文件,原代码无需修改即可运行。
  3. 参数校验
    打开源文件确认实际表头行数,如果不是3行,对应调整skiprows的参数值,确保loadtxt从第一行数值内容开始解析即可。

内容的提问来源于stack exchange,提问作者SARAH AFTIS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:45:39