Python解析格式非常规的ASCII数据文件方法问询
问题
我有一份格式特殊的ASCII文件,表头按行排列,对应的数值及关联误差也按行组织。文件片段如下:
f 7523 10001 10002 10003 10004 10005 10006 10007 10008 10009 10010 10011 10012 10013 10014 10015 10016 10017 10018 10019 10020 10021 10022 vals 0.00000E+00 0.0000 7.65079E-12 0.7071 0.00000E+00 0.0000 3.87977E-14 0.5513 0.00000E+00 0.0000 0.00000E+00 0.0000 0.00000E+00 0.0000 0.00000E+00 0.0000 0.00000E+00 0.0000 1.92698E-14 0.7071 4.47277E-14 0.7071 0.00000E+00 0.0000 0.00000E+00 0.0000 0.00000E+00 0.0000 0.00000E+00 0.0000 1.10023E-11 0.7053 1.74410E-11 0.5005 0.00000E+00 0.0000 1.69181E-13 0.7071 0.00000E+00 0.0000 0.00000E+00 0.0000 0.00000E+00 0.0000 vals 1.34313E-06 0.0104 1.32163E-06 0.0102 1.30039E-06 0.0105 1.37575E-06 0.0106 1.30792E-06 0.0102 1.28351E-06 0.0104 1.32164E-06 0.0102 1.32969E-06 0.0104 1.31707E-06 0.0104 1.27281E-06 0.0103 1.28429E-06 0.0106 1.27027E-06 0.0105 1.29623E-06 0.0105 1.32037E-06 0.0101 1.28948E-06 0.0105 1.33163E-06 0.0106 1.36073E-06 0.0102 1.35462E-06 0.0102 1.38641E-06 0.0102 1.33099E-06 0.0102 1.35307E-06 0.0100 1.33882E-06 0.0105
我希望将该文件解析为五列的结构,示例如下:
10001 0.00000E+00 0.0000 1.34313E-06 0.0104 10002 7.65079E-12 0.7071 1.32163E-06 0.0102 10003 0.00000E+00 0.0000 1.30039E-06 0.0105 .... 10022 0.00000E+00 0.0000 1.33882E-06 0.0105
目前仅完成了基础的文件读取代码,不确定如何循环处理数据以得到目标格式:
# Open file f = open('data.txt', 'r') # Loop over lines and extract variables of interest for line in f: line = line.strip() columns = line.split()
解决方案
核心思路是分阶段提取三类数据:表头ID、两组vals对应的数值-误差对,最后将三者一一对应输出。完整实现代码如下:
# 初始化存储变量 ids = [] vals_sets = [] current_vals = [] with open('data.txt', 'r') as f: for line in f: line = line.strip() if not line: continue # 跳过空行 parts = line.split() # 收集表头ID行(排除'f'和'vals'开头的行) if parts[0] != 'f' and parts[0] != 'vals': ids.extend(parts) # 遇到'vals'标记,结束当前数据组的收集并分组 elif parts[0] == 'vals': if current_vals: # 将连续的数值和误差按每两个元素分组 grouped = [tuple(current_vals[i:i+2]) for i in range(0, len(current_vals), 2)] vals_sets.append(grouped) current_vals = [] # 收集当前vals组的数据行 else: current_vals.extend(parts) # 处理最后一组未收尾的vals数据 if current_vals: grouped = [tuple(current_vals[i:i+2]) for i in range(0, len(current_vals), 2)] vals_sets.append(grouped) # 按目标格式输出结果 for idx, id_val in enumerate(ids): val1, err1 = vals_sets[0][idx] val2, err2 = vals_sets[1][idx] # 格式化对齐,保证输出整齐 print(f"{id_val:<8} {val1} {err1:>6} {val2} {err2:>6}")
代码说明
- 文件管理:使用
with语句自动处理文件的打开与关闭,避免资源泄漏 - 数据分类收集:通过行内容标记区分表头ID、数据组切换、数据行三类内容
- 数据分组:用切片
i:i+2将连续的数值和误差配对,保证每个ID对应一组完整的数值-误差对 - 格式化输出:用格式化字符串控制列对齐,让输出结构更清晰
运行这段代码即可得到你需要的五列结构化输出。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

