您已经有了几个很好的答案,但我想退后一步,就您将来如何解决这些问题提供一些指导。获得快速答案有时会让您无法理解这些人最初是如何知道答案的。
当您缩小时,让我印象深刻的第一件事是您的任务是使用文件为您的程序提供配置。软件具有一次解决、随处使用的显着特性。至少 40 年来,配置文件一直是一个值得解决的问题,因此您可以打赌,您不需要自己解决这个问题。已经解决意味着有人已经弄清楚了所有的小问题和边缘案例,比如剥离线的结尾和处理预期的输入。当然,挑战在于了解已经存在的解决方案。如果你没有花 40 年时间揭开电脑的外壳,看看它们是如何运转的,那么很难“只知道”。因此,您可能会在 Google 上寻找“配置文件格式”之类的东西。
这将带您进入地球上最流行的配置文件系统之一 - INI 文件。现在和 30 年前一样有用,而且作为奖励,看起来与您的示例配置文件并没有太大的不同。然后你可能会搜索“read INI file in Python”之类的,遇到configparser就基本完成了。
或者您可能会看到,在过去 30 年的某个时候,YAML 成为了更流行的选择,您不知道吗,PyYAML 将为您完成大部分工作。
但这些都不能让您更好地使用 Python 从文本文件中提取数据。所以放大一点,你想知道如何提取文本文件中的部分行。同样,这个问题是一个古老的问题,如果你要了解这个问题(而不是仅仅得到解决方案),你会知道这被称为 解析 并且经常涉及 标记化。如果你做一些研究,比如说“在 python 中解析一个文本文件”,你就会了解不管是哪种语言都可以使用的通用技术,例如循环遍历行并依次拆分每一行。
再放大一步,您希望将新行从字符串末尾剥离,这样它就不会包含在您的值中。再一次,这不是一个新问题,使用正确的关键字,您可以挖掘出被广泛采用的解决方案。这通常被称为“chomping”或“stripping”,通过一些仔细的搜索词,你会找到rstrip() 和朋友,而不必做一些尴尬的事情,比如拆分 '\n' 字符。
您的最后一个问题是关于重新使用匹配对象。这更难研究。但同样,“解决方案”不一定会告诉你哪里出错了。您需要记住的是,for 循环中的语句是顺序的。要仔细考虑它们,您应该逐个在脑海中执行它们,并想象正在发生的事情。每次调用 match,它要么返回None,要么返回一个 Match 对象。除了检查if 语句中的真实性外,您从不使用该对象。下次你调用 match 时,你会使用不同的参数来调用,所以你会得到一个新的 Match 对象(或None)。因此,您根本不需要将对象保留在周围。你可以这样做:
if match('jira_url:', line):
jira_url = line[9:].split("\n")[0]
if match('auth_user:', line):
auth_user = line[10:].split("\n")[0]
等等。不仅如此,如果第一个if 触发了,那么您就不需要再次调用match - 它肯定不会触发相同line 的任何其他匹配。所以你可以这样做:
if match('jira_url:', line):
jira_url = line[9:].rstrip()
elif match('auth_user:', line):
auth_user = line[10:].rstrip()
等等。
但是你可以开始思考 - 为什么要在冒号上进行所有这些匹配,然后才在冒号处手动拆分字符串?你可以这样做:
tokens = line.rstrip().split(':')
if token[0] == 'jira_url':
jira_url = token[1]
elif token[0] == 'auth_user':
auth_user = token[1]
如果您继续进行这些改进(还有很多事情要做!),最终您将重新编写 configparse,但至少您会了解为什么使用现有的通常是个好主意实用的图书馆!