我正在阅读一些文本文件,我使用flag将数据附加到相应的变量。 文字如下:
header_1
some text
------------
-----------
some text
header_2
some text
------------
-----------
some text
header_3
some text
------------
-----------
some text
我正在逐行阅读:
if line=='header_1':
flag_1 = True
if line=='header_1':
flag_1 = False
flag_2 = True
if flag_1:
data_1.append(line)
elif flag_2:
data_2.append(line)
我想要避免的是每次到达文件的下一部分时再次将先前的标志设置为false,或者以更有效的方式进行。
答案 0 :(得分:1)
不是将所有内容硬编码为单独命名的变量,而是使用稍微宽泛的条件并将数据存储在数据结构中:
result = []
for line in file:
if line.startswith('header_'):
result.append([])
else:
result[-1].append(line)
这将通过文件查找标题。只要找到一个,它就会为您的整体结果添加一个新列表。否则,它会将该行添加到最后一个可用列表中。
答案 1 :(得分:1)
如何使用索引而不是标志?说你有2种内容,
toAppend = [[], []]
flag = 0
for line in f:
if line =='header_1':
flag = 1
elif line == 'header_2':
flag = 2
if flag:
toAppend[flag - 1].append(line)
答案 2 :(得分:1)
为什么不用一个state
变量替换标志
skip, h1, h2 = range(3)
state = skip
for line in lines:
if line == 'header_1':
state = h1
continue
elif line == 'header_2':
state = h2
continue
if state == h1:
data_1.append(line) # or whatever
elif state == h2:
data_2.append(line)
这是非常灵活的方法:如果标志不是互斥的,你可以使用set
标志:
h4, h5 = range(4, 6)
for line in lines:
if line == 'header_45':
state == {h4, h5}
continue
if state == {h5, h4}:
do_smth()
if h5 in state:
do_smth_more()
答案 3 :(得分:0)
构建字典,标题为键,相应的数据列表为值。将最后一个有效标头保留在内存中。所以:
dict_of_results = {}
curr_header = ""
for line in file:
if line.startswith('header_'):
curr_header = line
if curr_header not in dict_of_results:
dict_of_results[curr_header] = []
dict_of_results[curr_header].append(line)
此表单还允许相同的标题出现在文本中的不同位置。