我应该将包含在.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"
所以我想知道:
如果我的.cfg
文件确实错误或者语法被接受了。
如果您知道使用它的人是什么语法,那么我可以查看其文档。也许他让它被另一种语言读取而不是Python?
如果可能的话,你可以给我一个解析器的例子!
答案 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定义,它为你创建一个解析器(至少在理论上)。