【问题标题】:Need help reading .cfg file需要帮助阅读 .cfg 文件
【发布时间】:2018-05-17 08:53:56
【问题描述】:

我应该将包含在.cfg 文件中的配置值导入我的字典中,如下所示。

Category1 {
    Subcategory1 {
        Data1 = 120        # range [0:255]
        Data2 = "R_TRUE"   # Values "R_TRUE" "R_FALSE"
    }
    Subcategory2 {
        Data3 = 0
    }
}

使用ConfigParser 时,控制台告诉我我的文件缺少标题,我认为这些标题应该写成[header]

这是我第一次阅读.cfg 文件,我在互联网上找到的任何示例都是这样写的:

[Category1]
A = 0
B = 10
C = "R_TRUE"

所以我想知道:

  1. 如果我拥有的这个.cfg 文件确实是错误的,或者它是被接受的语法。

  2. 如果您知道制作它的人使用的语法,那么我可以查看它的文档。也许他让它被 Python 以外的其他语言读取?

  3. 如果可能的话,你可以给我一个解析器的例子!

【问题讨论】:

  • 这看起来像是 HOCON 的奇怪版本。您可以尝试在互联网上搜索各种配置格式,如果幸运的话,您会识别它并找到解析它的 Python 模块,如果不是,您将不得不自己编写解析器。
  • @zwer 它确实类似于 json。我一直在寻找一种不存在太久的语法,所以我想我将为 python 制作自己的解析器!感谢您的帮助!

标签: python parsing config configparser


【解决方案1】:

您可以使用一些正则表达式为此构建解析器。这是一个例子。

cfg = '''\
Category1 {
    Subcategory1 {
        Data1 = 120        # range [0:255]
        Data2 = "R_TRUE"   # Values "R_TRUE" "R_FALSE"
    }
    Subcategory2 {
        Data3 = 0
    }
}'''

import re
category_match = re.compile(r'(\w+)\s*{')
value_match = re.compile(r'(\w+)\s*=\s*([0-9]+|"[^"]*")')
close_match = re.compile(r'}')

for line in cfg.split('\n'):
    m = category_match.search(line)
    if m:
        print ('1: ', m.groups()[0])
    m = value_match.search(line)
    if m:
        print ('2: ', m.groups()[:])
    m = close_match.search(line)
    if m:
        print ('3: close found')

输出是这样的。

1:  Category1
1:  Subcategory1
2:  ('Data1', '120')
2:  ('Data2', '"R_TRUE"')
3: close found
1:  Subcategory2
2:  ('Data3', '0')
3: close found
3: close found

在每个输出行中,数字是与输入行匹配的正则表达式。

【讨论】:

    【解决方案2】:

    这个语法似乎是从 HOCON (json) 定制的。我现在最好的解决方案是制作自己的解析器以使其适应我想要的语法。

    我不知道如何结束这个主题,但是如果有人对遇到与我相同的问题的人有真正的答案,请随时分享! :)

    【讨论】:

      【解决方案3】:

      如果您熟悉EBNF,则可以使用python EBNFparser 包节省大量时间。 Docs

      基本上你给它一个语言的 EBNF 定义,它会为你创建一个解析器(至少在理论上)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-15
        • 2017-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-01
        相关资源
        最近更新 更多