我有settings.py文件,如下所示:
DEBUG = True
CACHE_IP = '0.0.0.0'
DB_SETTINGS = {
'SERVERS': ['127.0.0.1:80'],
'MAX_IDLE_TIME' : 180,
}
此文件存储在外部云存储中。
我有一个进程获取此文件的url,并将其加载到内存(而不是磁盘)。当它加载到内存中时,它将是字符串类型,如下所示:
"DEBUG = True\n CACHE_IP = '0.0.0.0'\n DB_SETTINGS = {\n 'SERVERS': ['127.0.0.1:80'],\n 'MAX_IDLE_TIME' : 180,\n}\n"
例如我如何从这个字符串中获取值?我的意思是,我怎样才能获得一个字典,其中key =来自文件的动词名称,而value =来自文件的值?这有什么pythonic方式吗?
所以我的字典会是这样的:
{'DEBUG': True, 'CACHE_IP' = '0.0.0.0', 'DB_SETTINGS': {...}}
答案 0 :(得分:2)
您的要求非常具体,但确实会出现这种要求。所以,我尝试使用以下方法解决这个问题:
In [102]: import ast # Do not use eval(its unsafe)
In [103]: string = "DEBUG = True\n CACHE_IP = '0.0.0.0'\n DB_SETTINGS = {\n '
...: SERVERS': ['127.0.0.1:80'],\n 'MAX_IDLE_TIME' : 180,\n}\n"
...:
In [104]: def parse_key_val(string):
...: tmp_dict = {}
...: for r in re.split('(?<![{},])\n (?!{)', string):
...: key, val = r.split(" = ")
...: if '{' in val:
...: val = ast.literal_eval(val)
...: tmp_dict[key] = val
...: return tmp_dict
...:
In [105]: parse_key_val(string)
Out[105]:
{'CACHE_IP': "'0.0.0.0'",
'DB_SETTINGS': {'MAX_IDLE_TIME': 180, 'SERVERS': ['127.0.0.1:80']},
'DEBUG': 'True'}
此解决方案适用于您提供的字符串,但在某些复杂情况下可能(或不会)失败。但是这个解决方案为如何开始提供了一个很好的起点。您可能需要进行一些修改才能使其适用于复杂的情况。
现在进入该计划,这里要了解的重要部分是:
re.split('(?<![{},])\n (?!{)', string)
和
val = ast.literal_eval(val)
(?<![{},])\n (?!{)
中的模式re.split
表示在字符\n
上拆分字符串,但前提是它不在{
或}
或{{1}之后而不是,
之前。创建此正则表达式是为了不在dict字符串中拆分{
行字符。
不是第二部分\n
建立在上述正则表达式步骤之上,因为上面的步骤不会破坏dict字符串。分割后得到的字符串dict部分是:
val = ast.literal_eval(val)
使用"DB_SETTINGS = {\n 'SERVERS': ['127.0.0.1:80'],\n 'MAX_IDLE_TIME' : 180,\n}\n"
解析dict,嵌套dict和list中的任务非常容易。那个!
还有一点,不要使用eval作为解决方案之一,这是一个安全隐患。
您可以阅读有关ast.literal_eval
here
答案 1 :(得分:1)
一种方法是使用eval
函数来执行文本。
eval("DEBUG = True\n CACHE_IP = '0.0.0.0'\n DB_SETTINGS = {\n 'SERVERS': ['127.0.0.1:80'],\n 'MAX_IDLE_TIME' : 180,\n}\n")
settings_dict = {}
settings_dict['DEBUG'] = DEBUG
settings_dict['CACHE_IP'] = DEBUG
settings_dict['DB_SETTINGS'] = DB_SETTINGS
我不知道如何“自动化”字典创建。