【问题标题】:Python Advice for a beginner. Regex, Dictionaries etc?给初学者的 Python 建议。正则表达式,字典等?
【发布时间】: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
  }

我应该使用正则表达式、行拆分还是模块?如果我的配置文件中有多个作业,我会使用字典将作业与池相关联吗?

【问题讨论】:

    标签: python regex dictionary configuration-files


    【解决方案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 库。

        【讨论】:

          猜你喜欢
          • 2019-03-04
          • 1970-01-01
          • 2014-03-22
          • 2011-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-11
          相关资源
          最近更新 更多