从内存设置文件

时间:2017-12-06 18:03:45

标签: python

我有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': {...}}

2 个答案:

答案 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

我不知道如何“自动化”字典创建。