需要帮助阅读

2024-04-20 12:59:45 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 文件falsetrue字典头文件语法rangecfg
3条回答

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

基本上你给它一种语言的EBNF定义,它为你创建一个解析器(至少在理论上是这样)。你知道吗

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

我不知道如何结束这个话题,但如果有人有一个真正的答案,谁得到了与我一样的问题,随时分享!:)

您可以使用几个regex表达式为此构建一个解析器。下面是一个例子。你知道吗

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

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

相关问题 更多 >