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

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}")

代码说明

  1. 文件管理:使用with语句自动处理文件的打开与关闭,避免资源泄漏
  2. 数据分类收集:通过行内容标记区分表头ID、数据组切换、数据行三类内容
  3. 数据分组:用切片i:i+2将连续的数值和误差配对,保证每个ID对应一组完整的数值-误差对
  4. 格式化输出:用格式化字符串控制列对齐,让输出结构更清晰

运行这段代码即可得到你需要的五列结构化输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:32:36