如何补全固定宽度无分隔符数据中缺失'e'的科学计数法标识?
解决固定宽度文件中缺失'e'的科学计数法读取问题
这种固定宽度文件里的科学计数法格式错误确实挺闹心的,不过用正则表达式配合numpy的读取工具就能轻松解决。我给你详细说下具体的实现步骤和两种实用方法:
核心思路
问题的关键是识别数字末尾紧跟正负号的格式,然后在两者之间插入'e'。因为是固定宽度文件,我们需要先按指定宽度拆分每个数值字符串,再对每个字符串做格式修复。
具体实现方法
方法一:先读取文本处理,再转numpy数组
适合需要先预览处理结果,或者文件格式有特殊情况的场景:
import numpy as np import re # 第一步:根据你的文件实际情况,设置每个数值的固定宽度 num_width = 7 # 示例宽度,替换成你文件的真实宽度 # 读取文件内容 with open("your_data_file.txt", "r") as f: all_lines = [line.strip() for line in f if line.strip()] processed_rows = [] for line in all_lines: # 按固定宽度拆分当前行的所有数值字符串 num_strings = [line[i:i+num_width].strip() for i in range(0, len(line), num_width)] # 修复每个数值的科学计数法格式 fixed_strings = [re.sub(r"(\d)([-+])", r"\1e\2", s) for s in num_strings] # 转成浮点数并加入结果列表 processed_rows.append([float(s) for s in fixed_strings]) # 转成numpy数组 final_data = np.array(processed_rows)
方法二:用numpy genfromtxt 直接在读取时处理
更高效,适合大型文件,不需要额外存储中间文本:
import numpy as np import re def fix_sci_format(raw_bytes): # 将numpy读取的字节数据转成字符串,去除多余空格 num_str = raw_bytes.decode("utf-8").strip() # 插入缺失的'e' fixed_str = re.sub(r"(\d)([-+])", r"\1e\2", num_str) return float(fixed_str) # 设置每个数值的宽度列表,比如一行有6个数值,每个宽7 widths = [7] * 6 # 读取文件并自动处理每个字段 final_data = np.genfromtxt( "your_data_file.txt", delimiter=None, widths=widths, converters={idx: fix_sci_format for idx in range(len(widths))} )
关键注意事项
- 确认固定宽度:一定要准确设置
num_width或widths,否则会拆分错误导致格式修复失败。 - 正则适配场景:如果你的文件只有负号(没有正号的科学计数法),可以把正则改成
r"(\d)(-)",更精准;如果有正号(比如1.23+4),当前正则也能处理。 - 测试验证:先拿一小段数据测试,比如输入
"9.993-3",修复后应该是"9.993e-3",确保替换逻辑正确再处理全量数据。
内容的提问来源于stack exchange,提问作者user9415015
相关产品推荐
相关产品推荐

