将除一个变量外的所有变量设置为false

时间:2016-12-04 21:39:11

标签: python

我正在阅读一些文本文件,我使用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,或者以更有效的方式进行。

4 个答案:

答案 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)

此表单还允许相同的标题出现在文本中的不同位置。