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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:41:15