Python:如何逐行读取与用户设置的值相对应的文本文件,并在行包含特定字符时结束

问题描述 投票:0回答:1

我有一个具有这种格式的文本文件:

--------------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

当我运行程序时,我没有看到任何错误;但列表似乎没有附加任何值。我不确定我是否遗漏了某些内容,或者我的程序没有按我的意愿正确读取这些行。想知道是否有人可以提供任何关于为什么会这样的见解。

python text-files readlines
1个回答
0
投票

我不认为你真的需要这个神奇的数字。对应于一个事件的每一行都以其自身的事件编号开头,因此只需删除不是以您想要的事件编号开头的每一行:

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 可能会更简单,但对于一个简单的问题来说,这可能有点过分了。

© www.soinside.com 2019 - 2024. All rights reserved.