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

Python按指定事件号读取文本文件,代码无报错但列表未填充的问题

问题描述

我有一个如下格式的文本文件:

--------------Run number= 169 ------------
-------Log book info: 
        NaI run--> Test077
         Beam ~ 320 nAmp, run duration is 1hr
         Scalar: 977493, DAQ: 339399
eventno.    X   Y   Z   Tb  Q
12345678  0
0   59.0782 -58.7822    62.24   158 180.9
0   103.18  -43.1458    50.72   149 51
0   28.7109 -70.2263    87.84   178 124.2
0   82.8706 -63.4557    62.24   158 81.2
0   89.6407 -63.4562    59.68   156 59.3
0   31.9979 -65.5526    87.84   178 66.6
0   35.4805 -63.4559    89.12   179 84.7
0   38.7676 -58.7821    89.12   179 133.6
12345678  1
12345678  2
2   25.2279 -72.3226    48.16   147 221.55
2   28.7109 -70.2263    48.16   147 1587.7
2   76.1009 -63.4562    46.88   146 110.35
2   31.9979 -65.5526    48.16   147 1601.8
2   35.4805 -63.4559    48.16   147 310.25
2   31.9979 -58.7826    49.44   148 492.8
2   35.4805 -56.6859    46.88   146 42.6
2   1.63117 -43.1461    73.76   167 54.55
2   4.91818 -38.4723    76.32   169 75.4
2   11.6882 -38.4723    76.32   169 325.95
2   18.4578 -38.4719    72.48   166 76
2   15.1708 -43.1457    77.6    170 144.6

需求:按用户输入的事件号(数据第一列,变量event_number)逐行读取对应数据,当文本中出现用户设定的magic_number(值为12345678)时停止读取,并将对应的X、Y、Z、Tb、Q数据分别存入独立列表。

我的代码如下:

event_number = '0'
magic_number = '12345678'

x = []
y = []
z = []
tb = []
q = []

file = 'Runnumber169raw10.txt'

with open(file, 'r') as raw_dat:
    for line in raw_dat:
        
        if line[0] == event_number:
            x.append(line[1])
            y.append(line[2])
            z.append(line[3])
            tb.append(line[4])
            q.append(line[5])
        
        if magic_number in line:
            break

运行程序后无报错,但列表未添加任何值,求原因分析及解决建议。

原因分析
  1. 过早触发终止:文件开头的12345678 0行包含magic_number,程序刚循环到这行就执行break终止,根本没处理到后面的事件号0的数据行。
  2. 行处理逻辑错误:直接用line[index]取字符的方式完全错误,文本行是空格分隔的字段,line[1]只是行的第二个字符(大概率是空格),不是X字段的实际值。
  3. 未过滤无关行:文件开头的日志分隔线、日志内容、表头行没有被跳过,这些行结构和数据行不一致,干扰事件号的判断。
解决建议

修改后的代码如下,关键改动附注释说明:

event_number = '0'
magic_number = '12345678'

x = []
y = []
z = []
tb = []
q = []

file = 'Runnumber169raw10.txt'

with open(file, 'r') as raw_dat:
    for line in raw_dat:
        # 跳过空行、分隔线、日志行和表头行
        stripped_line = line.strip()
        if not stripped_line or stripped_line.startswith(('--------------', '-------', 'eventno.')):
            continue
        
        # 拆分每行的字段,按空格分割
        parts = stripped_line.split()
        # 只有当magic_number行对应的事件号不是目标时才终止
        if parts[0] == magic_number:
            if parts[1] != event_number:
                break
            continue
        
        # 匹配目标事件号,提取对应字段并转换数据类型
        if parts[0] == event_number:
            x.append(float(parts[1]))
            y.append(float(parts[2]))
            z.append(float(parts[3]))
            tb.append(int(parts[4]))
            q.append(float(parts[5]))

关键改动说明:

  • 过滤无关行:只处理有效数据行,避免无效行干扰判断。
  • 正确拆分字段:用split()按空格拆分每行得到字段列表,通过索引获取对应字段值,而非直接取字符。
  • 调整终止逻辑:只有当遇到的magic_number行对应事件号不是目标事件号时才终止,比如开头的12345678 0是目标事件的起始标记,继续处理后续0行,直到遇到12345678 1时终止。
  • 数据类型转换:将读取的字符串转换为对应数值类型(float/int),方便后续计算使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:23:09