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
运行程序后无报错,但列表未添加任何值,求原因分析及解决建议。
原因分析
- 过早触发终止:文件开头的
12345678 0行包含magic_number,程序刚循环到这行就执行break终止,根本没处理到后面的事件号0的数据行。 - 行处理逻辑错误:直接用
line[index]取字符的方式完全错误,文本行是空格分隔的字段,line[1]只是行的第二个字符(大概率是空格),不是X字段的实际值。 - 未过滤无关行:文件开头的日志分隔线、日志内容、表头行没有被跳过,这些行结构和数据行不一致,干扰事件号的判断。
解决建议
修改后的代码如下,关键改动附注释说明:
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
相关产品推荐
相关产品推荐

