给初学者的 Python 建议。正则表达式,字典等?
Posted
技术标签:
【中文标题】给初学者的 Python 建议。正则表达式,字典等?【英文标题】:Python Advice for a beginner. Regex, Dictionaries etc? 【发布时间】:2010-11-01 08:48:20 【问题描述】:我正在编写我的第二个 python 脚本来尝试解析配置文件的内容,并希望得到一些新手建议。我不确定是否最好使用正则表达式来解析我的脚本,因为它有多行?我也一直在阅读有关字典的内容,并想知道这是否是一种好习惯。我不一定要寻找代码,只是朝着正确的方向前进。
示例:我的配置文件如下所示。
Job
Name = "host.domain.com-foo"
Client = host.domain.com-fd
JobDefs = "DefaultJob"
FileSet = "local"
Write Bootstrap = "/etc/foo/host.domain.com-foo.bsr"
Pool = storage-disk1
我应该使用正则表达式、行拆分还是模块?如果我的配置文件中有多个作业,我会使用字典将作业与池相关联吗?
【问题讨论】:
【参考方案1】:如果你可以改变配置文件格式,你可以直接把你的文件写成Python文件。
config.py
job =
'Name' : "host.domain.com-foo",
'Client' : "host.domain.com-fd",
'JobDefs' : "DefaultJob",
'FileSet' : "local",
'Write Bootstrap' : "/etc/foo/host.domain.com-foo.bsr",
'Pool' : 'storage-disk1'
yourscript.py
from config import job
print job['Name']
【讨论】:
这对于安全来说通常是非常危险的,因为简单地读取配置文件可能会运行任意操作。 +1:非常好。这不存在安全问题,除非某个疯狂的人决定编写疯狂的参数值。 如果你不能改变格式但你信任他的文件,你可以阅读,替换:for = 和 eval() 但是您不能总是信任该文件。许多程序使用相对名称(“config/.py”)读取文件,因此在 /tmp 等任何人都可以放置此类文件的目录中执行时很容易受到攻击。 @bortzmeyer:由于只导入作业,因此风险很小。如果您关心有人恶意更改值以指向错误的资源,那么任何其他配置文件都可能发生这种情况。如果您担心加载 dict 时会执行代码,那么嗯……您有什么可能性?将 dict 子类化并覆盖 getitem 以执行某些代码的“工作”?相当棘手。 OP 没有提到安全性。【参考方案2】:这个任务有许多现有的替代方案,json、pickle 和 yaml 到名称 3。除非你真的想自己实现这个,你应该使用其中之一。即使您自己滚动,遵循上述格式之一仍然是一个好主意。
此外,使用解析器/生成器或类似工具进行解析是一个更好的主意,正则表达式对于此类任务将更难维护且效率更低。
【讨论】:
【参考方案3】:如果你的配置文件可以转成python文件,只要把它做成字典并导入模块。
Job = "Name" : "host.domain.com-foo",
"Client" : "host.domain.com-fd",
"JobDefs" : "DefaultJob",
"FileSet" : "local",
"Write BootStrap" : "/etc/foo/host.domain.com-foo.bsr",
"Pool" : "storage-disk1"
您只需调用 Job["Name"]..etc 即可访问这些选项。
ConfigParser 也很容易使用。您可以创建一个如下所示的文本文件:
[Job]
Name=host.domain.com-foo
Client=host.domain.com-fd
JobDefs=DefaultJob
FileSet=local
Write BootStrap=/etc/foo/host.domain.com-foo.bsr
Pool=storage-disk1
只要像上面的一样保持简单。
【讨论】:
+1:保持简单。重用现有的解决方案。尽可能少地发明。生活的话。【参考方案4】:标准库中的ConfigParser 模块可能是解析 Python 脚本正在使用的配置文件的最 Pythonic 和最直接的方式。
如果您仅限于使用您概述的特定格式,那么使用 pyparsing 非常好。
【讨论】:
【参考方案5】:我认为正则表达式不足以解析这样的内容。您可以查看一个真正的解析器,例如pyparsing。或者,如果文件格式在您的控制范围内,您可以考虑使用 XML。有用于解析的标准 Python 库。
【讨论】:
以上是关于给初学者的 Python 建议。正则表达式,字典等?的主要内容,如果未能解决你的问题,请参考以下文章