如何读取文本文件,遇到某个值就停止继续读取

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

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

0   -82.871 2.52531 36.64   138 96.05
0   -76.1014    2.52577 35.36   137 83.9
0   -76.1869    5.57562 35.36   137 62.8
0   -18.1623    -11.6886    386.08  411 200.9
0   -4.62234    -4.91846    325.92  364 252.2
0   -2.52609    -1.63149    325.92  364 85.4
0   -2.52609    -1.63149    112.16  197 48.4
0   -18.1623    -4.91846    -54.24  67  69.55
0   -18.1623    -4.91846    386.08  411 64.55
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

我编写了一个程序,它使用

line = raw_dat.readlines()[7:]
跳过整个标头并读取整个文件,直到遇到
magic_number
并中断循环:

file = 'Runnumber169raw10.txt'
magic_number = '12345678'

event1 = []
x1 = []
y1 = []
z1 = []
tb1 = []
q1 = []
Xnoselection = []
X = []
distanceradius = 0

with open(file, 'r') as raw_dat:
    line = raw_dat.readlines()[7:]
    
    for lines in line:
        lines.split()
        print(lines)
        if lines.split()[0] == magic_number:
            break

break
语句停止循环并存储对应于列值0的值。但我无法找到在这个
break
语句之后继续阅读的方法,因为
break
本质上终止了循环。有没有办法停止循环,存储数据,然后继续读取并重复?

python data-analysis break txt
2个回答
1
投票

继续而不是中断?

一种在 break 语句之后

继续
阅读的方法,因为
break
本质上终止了循环。

如果您想忽略以 magic number 为前缀的行并跳转到循环的下一次迭代,那么最简单的语句将是

continue

有2条循环中断语句:

  1. break
    :提前退出循环
  2. continue
    :跳过循环的迭代

另请参阅:

条件操作(停止、存储、继续)

有没有办法停止循环,存储数据,然后继续读取并重复?

当您需要循环触发条件操作时,例如要保存状态或更改模式,然后使用 conditional

if
并调用 action 作为函数。

示例

该函数可能是

store_lines_for_event
将行写入以事件命名的文本文件中:

def store_lines_for_event(collected_lines, event_id):
    filename = 'events_' + str(event_id) + '.txt'
    with open(filename, 'a') as f:
        f.writelines(collected_lines)

循环可以有条件地使用该函数 (

if
),可以在
else
分支中进行常规处理,也可以使用
continue
语句。

让我们从

if
开始..
else
:

event_id = ''
collected_lines = []
for line in lines:
    # the default action that applies to all before
    print("Read line", line)

    if line.startswith(magic_number):  # conditional special handling
        store_lines_for_event(collected_lines, event_id)
        event_id = line.replace(magic_number, '').strip()
        collected_lines = []
    else:  # regular handling of lines
        collected_lines.append(line)

    # the default action that applies to all afterwards
    print("collected lines in buffer now", len(collected_lines))

这也可以等效地写成不带 else,但带有 continue ,如下所示:

event_id = ''
collected_lines = []
for line in lines:
    if line.startswith(magic_number):  # conditional special handling
        store_lines_for_event(collected_lines, event_id)
        event_id = line.replace(magic_number, '').strip()
        collected_lines = []
        continue  # directly jump to the next iteration and line and
                  # ignore the following statements of the loop body

    # regular handling of lines
    collected_lines.append(line)

0
投票

第一次迭代时使用

enumerate()
获取行索引。然后您可以从上次中断的地方重新开始。

with open(file, 'r') as raw_dat:
    line = raw_dat.readlines()[7:]
    
for index, lines in enumerate(line):
    print(lines)
    if lines[0] == magic_number:
        break

for lines in line[index+1:]:
    # do other stuff

或者不将整个文件读入列表,直接循环文件行。

with open(file, 'r') as raw_dat:
    # skip first 7 lines
    for _ in range(7):
        raw_data.readline()

    for lines in raw_dat:
        print(lines)
        if lines.split()[0] == magic_number:
            break

    for lines in raw_dat:
        # do other stuff
© www.soinside.com 2019 - 2024. All rights reserved.