Python3:找到匹配的行后打印块

时间:2020-06-26 17:32:19

标签: python

我要从以下文件中仅提取属于“ Family2”的名称。

例如,

key1 =“家庭”

key2 ='2'

这样我只能得到詹姆斯,艾米丽和朱迪。

Family1:
  name: John
  name: Rachel
  name: Cindy
  name: William

Family2:
  name: James
  name: Emily
  name: Judy

Family3:
  name: Steve
  name: Olivia
  name: Noah
  name: William

Family4:
  name: Rachel

Family5:
  name: Mason

我可以了解以下内容。

key1 = 'Family'
key2 = '2'

found = False

matchedlines = []

with open('families.txt', 'r') as f:
  for line in f:
    if found == False:
      if key1 in line and key2 in line:
        found = True
    else:
      if key1 not in line:
        matchedlines.append(line)
      else:
        found = False

print(matchedlines)

输出:

['  name: James\n', '  name: Emily\n', '  name: Judy\n']

我认为我的逻辑还可以,但是任何建议使这种设计更整洁或更Pythonic都会受到赞赏。

谢谢。

1 个答案:

答案 0 :(得分:1)

一些相当次要的评论。

  • 不需要if found == False-它只包含一个布尔值,因此您可以只使用if not found

  • 在检查起始行时,您可能希望以排除例如Family12:

  • 您可以使用elif来代替仅包含else块的if块-if语句可以具有任意数量的elif块,然后是可选的else块。

  • 在检查名称中确实包含名称之后,您可能要从匹配的行中提取名称(您的代码在匹配的行中包含空白行)。下面的代码包含有关如何简单执行此操作的建议。

  • Family2部分的末尾
  • ,而不是设置found = False,您可以完全摆脱循环,而不必费心处理文件的其余部分

  • 每个缩进级别四个空格可能比2更可读(PEP8样式指南中使用)

key1 = 'Family'
key2 = '2'
key3 = 'name:'

found = False

names = []

with open('families.txt', 'r') as f:
    for line in f:
        if not found:
            if key1 + key2 + ":" in line:
                found = True
        elif key1 in line:
            break
        elif key3 in line:
            name = line.replace(key3, "").strip()
            names.append(name)

print(names)
相关问题