如何用numpy读取含格式错误浮点数的文本文件?
处理损坏的浮点数文本文件读取问题
针对你遇到的部分浮点数缺失科学计数法E字符(如0.710084093014+195应为0.710084093014E+195)、且需将无法解析的数据转为NaN的需求,以下两种高效处理方法无需手动修改文件:
方法一:批量正则替换(适合中等大小文件)
先一次性修正文件内容的格式错误,再用numpy.loadtxt读取,速度较快:
import numpy as np import re from io import StringIO # 读取文件内容并批量修正格式 with open("path/to/datafile", "r") as f: content = f.read() # 正则替换:给非开头的+/-前添加E(避免替换数值本身的正负号) content = re.sub(r'(?<=[0-9.])\+', 'E+', content) content = re.sub(r'(?<=[0-9.])\-', 'E-', content) # 将修正后的内容转为内存文件对象,用loadtxt读取 data = np.loadtxt(StringIO(content))
正则表达式说明:
(?<=[0-9.]):正向预查,确保+/-前是数字或小数点,不会替换类似-123.45开头的负号- 批量替换所有符合条件的错误格式
方法二:逐行转换器(适合超大文件)
如果文件过大无法一次性读入内存,使用numpy.genfromtxt配合自定义转换器,逐行处理并将无法解析的值转为NaN:
import numpy as np def fix_corrupted_float(s): # 转换为字符串(genfromtxt默认传入字节类型) s_str = s.decode("utf-8") # 修复缺失E的科学计数法格式 if '+' in s_str[1:]: s_str = s_str.replace('+', 'E+', 1) if '-' in s_str[1:]: s_str = s_str.replace('-', 'E-', 1) # 尝试转换为浮点数,失败则返回NaN try: return float(s_str) except ValueError: return np.nan # 自动获取列数并对所有列应用转换器 col_count = np.genfromtxt("path/to/datafile", max_rows=1).size data = np.genfromtxt( "path/to/datafile", converters={i: fix_corrupted_float for i in range(col_count)} )
补充说明
- 方法一适合文件大小在内存可承受范围内的场景,批量处理效率更高
- 方法二逐行读取,内存占用低,同时兼容其他无法解析的错误格式,统一返回
NaN
内容的提问来源于stack exchange,提问作者fgoudra
相关产品推荐
相关产品推荐

