2017-09-01 101 views
3

我想将字符串转换为字典。我以前在一个文本文件中保存了这本字典。Python将字符串放入字典

现在的问题是,我不知道密钥的结构如何。这些值由Counter(dictionaryName)生成。字典真的很大,所以我无法检查每一个关键字,看看它是如何可能的。

的按键可包含简单的报价像”,双引号”,逗号,也许其他字符那么,有没有可能把它转换回字典

例如这是存储在文件中:?

Counter({'element0':512, "'4,5'element1":50, '4:55foobar':23,...}) 

我发现以前的解决方案,例如JSON,但我有双引号的问题,我不能简单地划分为逗号。

+2

我不明白你在努力完成什么,事实上, n正确地工作...... **,**完全**存储在文件中?你如何“保存字典”?你是否刚刚将字符串表示写入文件?这将是你的第一个错误 - 你应该使用许多可用的序列化格式之一。 –

+1

所以你有文本形式的字典?你想将它转换成字典? –

+0

@Mohsen_Fatemi是我将它存储在一个文本文件中。花了好几个小时才得到字典,所以我想把它保存在一个文件中。但我没有想到,它会包含双引号等 – Rust

回答

3

如果您信任源,负载from collections import Countereval()字符串

1

您可以删除Counter()部分,然后用ast.literal_eval解析休息,只要它仅涉及基本的Python数据类型:

import ast 

def parse_Counter_string(s): 
    s = s.strip() 
    if not (s.startswith('Counter(') and s.endswith(')')): 
     raise ValueError('String does not match expected format') 
    # Counter(is 8 characters 
    # 12345678 
    s = s[8:-1] 
    return Counter(ast.literal_eval(s)) 

在未来,我建议您选择不同的方式序列化您的数据。

2

如何像:

>> from collections import Counter 
>> line = '''Counter({'element0':512, "'4,5'element1":50, '4:55foobar':23})''' 
>> D = eval(line) 
>> D 
Counter({"'4,5'element1": 50, '4:55foobar': 23, 'element0': 512}) 
0

您可以使用demjson库这样做,你可以直接在你的程序有文字

import demjson 

counter = demjson.decode("enter your text here") 

,如果它是在该文件中,你可以请执行以下步骤:

WD = dirname(realpath(__file__)) 
file = open(WD, "filename"), "r") 
counter = demjson.decode(file.read()) 
file.close()