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

Python 3.10中特殊格式字符串转float的解决方案求助

解决思路与代码修改

核心问题是处理省略e的科学计数法字符串(如3.841-11需转为3.841e-11),可以通过自定义转换函数批量处理这类格式,再替换原代码中的float()调用。

自定义转换函数

编写一个函数,自动识别并补全科学计数法的e符号:

def custom_str_to_float(s):
    s = s.strip()
    # 定位最后一个负号或正号的位置(区分开头的负号和指数的符号)
    sign_pos = max(s.rfind('-'), s.rfind('+'))
    # 若符号不在字符串开头,说明是指数部分,插入'e'
    if sign_pos > 0:
        s = s[:sign_pos] + 'e' + s[sign_pos:]
    return float(s)

修改后的完整读取代码

替换原代码中的float()调用,同时优化文件读取和循环逻辑:

def read_fem(location):  
    def custom_str_to_float(s):
        s = s.strip()
        sign_pos = max(s.rfind('-'), s.rfind('+'))
        if sign_pos > 0:
            s = s[:sign_pos] + 'e' + s[sign_pos:]
        return float(s)
    
    # 使用with语句安全打开文件
    with open(location, 'r') as f:
        mesh = f.read().splitlines()
    
    point = []
    
    for line in mesh:
        # 跳过注释行
        if '$' in line:
            continue
        if 'GRID' in line:
            # 提取网格编号时去除空格,避免转换错误
            number = int(line[8:16].strip())
            x = custom_str_to_float(line[24:32])
            y = custom_str_to_float(line[32:40])
            z = custom_str_to_float(line[40:48])
            point.append([number, x, y, z])
    return point

说明

  • 该函数能兼容多种格式:普通小数(如667.9)、开头带负号的小数(如-44.0332)、省略e的科学计数法(如3.055-13)、无整数部分的小数(如.850903)。
  • 优化了原代码的文件读取方式,with语句会自动关闭文件,避免资源泄漏;直接遍历行而非使用索引,代码更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:01:03