我要从以下文件中仅提取属于“ 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都会受到赞赏。
谢谢。
答案 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)