np.loadtxt读取文本文件报错:无法将字符串'\x00'转换为浮点数
报错原因
报错里的\x00是ASCII码值为0的空字符,不属于合法的数值文本内容,numpy.loadtxt默认按纯ASCII/UTF-8编码解析文件、尝试把内容转成浮点数时,遇到这个无法识别的字符就会抛出该ValueError。
这类问题在读取实验设备导出的测量数据时非常常见,核心诱因通常是以下几种:
- 最普遍的原因是文件编码不匹配:多数光束分析仪、工业相机导出的刃边测量数据文件默认用UTF-16(多为UTF-16-LE)编码保存,这类编码下每个数字、标点占2个字节,普通数字、逗号的高位字节值全为0,按默认编码读取时就会解析出大量
\x00字符 - 文件导出过程异常损坏,或者设备自动在文件头、文件尾追加了带空字节的冗余标识内容
- 你设置的
skiprows=3参数和实际文件表头行数不匹配,未跳过的表头行里混有空字节内容
解决方法
按操作成本从低到高选以下方案即可:
- 修改代码兼容带空字节的文件(推荐,不用改动原始数据)
不要直接把文件名传给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都能正常解析。 - 手动清理源文件
用Notepad++等纯文本编辑器打开两个txt文件,查看右下角显示的文件编码,如果显示为UTF-16,直接在编码菜单里选择「转为UTF-8无BOM编码」后保存;也可以直接把文件里的所有数值内容复制,新建一个空白txt文件粘贴后保存,用新文件替换原来的文件,原代码无需修改即可运行。 - 参数校验
打开源文件确认实际表头行数,如果不是3行,对应调整skiprows的参数值,确保loadtxt从第一行数值内容开始解析即可。
内容的提问来源于stack exchange,提问作者SARAH AFTIS
相关产品推荐
相关产品推荐

