Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于解析块的Python实用程序?_Python_Parsing - Fatal编程技术网

用于解析块的Python实用程序?

用于解析块的Python实用程序?,python,parsing,Python,Parsing,我有一个文件,它的开头类似于: databaseCons = { main = { database = "readable_name", hostname = "hostdb1.serv.com", instances= { slaves = { conns = "8" } } maxconns = "5", u

我有一个文件,它的开头类似于:

databaseCons = {
    main = {
        database = "readable_name",
        hostname = "hostdb1.serv.com",
        instances= {
            slaves = {
                conns = "8"
            }
        }
        maxconns = "5",
        user = "user",
        pass = "pass"
    }
}
所以,我想做的是把它解析成一个
dict
的子
dict
s,类似于:

databaseCons = {
    main = {
        database = "readable_name",
        hostname = "hostdb1.serv.com",
        instances= {
            slaves = {
                conns = "8"
            }
        }
        maxconns = "5",
        user = "user",
        pass = "pass"
    }
}
{'main':{'database':'readable_name','hostname':'hostdb1.serv.com','maxconns':'5','instances':{'slave':{'maxCount':'8'},'user':'user','pass':'pass'}

我认为上面的说法是有道理的。。。但如果没有,请随意编辑。基本上我想要的是:

conns = '8'

slave = dict()
slave['maxCount'] = conns

instances = dict()
instances['slave'] = slave

database = 'readable_name'
hostname = 'hostdb1.serv.com'
maxconns = '5'
user = 'user'
pas = 'pass'
main = dict()
main['database'] = database
main['hostname'] = hostname
main['instances'] = instances
main['maxconns'] = maxconns
main['user'] = user
main['pass'] = pas

databaseCons = dict()
databaseCons['main'] = main
有没有任何模块可以处理这种解析?甚至我上面的建议看起来都很混乱。。我想一定有更好的方法。

这里是配置文件的解析器:

from pyparsing import *

def to_dict(t):
    return {k:v for k,v in t}

series = Forward()
struct = Suppress('{') + series + Suppress('}')
value = quotedString.setParseAction(removeQuotes) | struct
token = Word(alphanums)
assignment = Group(token + Suppress('=') + value + Suppress(Optional(",")))
series << ZeroOrMore(assignment).setParseAction(to_dict)
language = series + stringEnd

def config_file_to_dict(filename):
    return language.parseFile(filename)[0]

if __name__=="__main__":
    from pprint import pprint
    pprint(config_file_to_dict('config.txt'))
从pyparsing导入*
定义到目录(t):
返回{k:v表示k,v表示t}
级数=前进()
struct=Suppress('{')+series+Suppress('}'))
value=quotedString.setParseAction(removeQuotes)|结构
标记=单词(字母)
赋值=组(标记+抑制('=')+值+抑制(可选(“,”))

你正在使用的语言已经是一种东西了吗?如果是的话,它叫什么?你在Python中找到任何解析器了吗?如果没有,为什么要使用它而不是更常见的东西,比如JSON?它是我们配置中预先存在的格式——因此很不幸,格式本身必须保持静态。为什么输出示例将DICT包装在列表中?我认为您不会找到这种语言的现成解析器。所以你有几个明显的选择。自定义递归下降解析器应该没有那么难,您可以使用任何“100行以下的JSON”解析器作为指导,因为它在许多方面都类似。或者,到JSON的递归下降转换可能需要比解析器更少的状态,然后您可以直接插入
JSON.loads
ijson
作为后端。或者您可以描述语法,然后使用语法分析器库或语法分析器生成器(如PyParsing)应该很简单。如果您确实想使用
eval
(您确实不想使用),至少可以使用
ast.literal\u eval
。这消除了安全漏洞,也意味着如果您有不符合此模式的意外数据,则与使用
eval
相比,它更有可能失败或生成一条中等程度的错误消息。