我有一个具有这种格式的文本文件:
--------------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
当我运行程序时,我没有看到任何错误;但列表似乎没有附加任何值。我不确定我是否遗漏了某些内容,或者我的程序没有按我的意愿正确读取这些行。想知道是否有人可以提供任何关于为什么会这样的见解。
我不认为你真的需要这个神奇的数字。对应于一个事件的每一行都以其自身的事件编号开头,因此只需删除不是以您想要的事件编号开头的每一行:
with open(file, 'r') as raw_dat:
records = [line.split() for line in raw_dat if line.split()[0] == event_number]
然后分成五个列表:
# split into five lists
x = [record[1] for record in records]
y = [record[2] for record in records]
z = [record[3] for record in records]
tb = [record[4] for record in records]
q = [record[5] for record in records]
如果它是一个非常大的数据集,使用 pandas 可能会更简单,但对于一个简单的问题来说,这可能有点过分了。