我有一个具有以下格式的文本文件:
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
本质上终止了循环。有没有办法停止循环,存储数据,然后继续读取并重复?
一种在
break
语句之后继续阅读的方法,因为本质上终止了循环。break
如果您想忽略以 magic number 为前缀的行并跳转到循环的下一次迭代,那么最简单的语句将是
continue
。
有2条循环中断语句:
break
:提前退出循环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)
第一次迭代时使用
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