需要帮助阅读.cfg文件

时间:2018-05-17 08:53:57

标签: python parsing config configparser

我应该将包含在.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. 如果可能的话,你可以给我一个解析器的例子!

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

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

我不知道如何关闭这个主题,但如果某人对我遇到同样问题的人有真正的答案,请随时分享! :)

答案 2 :(得分:0)

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

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