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
相关产品推荐
相关产品推荐

