字符串到python中的OrderedDict转换

时间:2012-05-08 12:41:13

标签: python string parsing ordereddictionary

我通过导入集合创建了一个python Ordered Dictionary并将其存储在名为'filename.txt'的文件中。文件内容看起来像

OrderedDict([(7, 0), (6, 1), (5, 2), (4, 3)])

我需要从另一个程序中使用这个OrderedDict。我这样做

myfile = open('filename.txt','r')
mydict = myfile.read()

我需要获得类型

的'mydict'
<class 'collections.OrderedDict'>

但是在这里,它出现了'str'类型 有没有办法在python中将字符串类型转换为OrderedDict类型?使用python 2.7

4 个答案:

答案 0 :(得分:7)

您可以使用pickle

存储和加载它
import cPickle as pickle

# store:
with open("filename.pickle", "w") as fp:
    pickle.dump(ordered_dict, fp)

# read:
with open("filename.pickle") as fp:
    ordered_dict = pickle.load(fp)

type(ordered_dict) # <class 'collections.OrderedDict'>

答案 1 :(得分:5)

此处的最佳解决方案是以不同的方式存储您的数据。例如Encode it into JSON

您也可以使用其他答案中解释的the pickle module,但这有潜在的安全问题(如下面的eval()所述) - 所以如果您知道数据总是在运行,请使用此解决方案值得信赖。

如果您无法更改数据格式,则还有其他解决方案。

真正糟糕的解决方案是使用eval()来执行此操作。这是真的 真的坏主意,因为它不安全,因为文件中的任何代码都将与other reasons一起运行

更好的解决方案是手动解析文件。好处是有一种方法可以让你作弊并更轻松地做到这一点。 Python有ast.literal_eval(),可以让你轻松地解析文字。虽然这不是文字,因为它使用OrderedDict,我们可以提取列表文字并解析它。

例如:(未经测试)

import re
import ast
import collections

with open(filename.txt) as file:
    line = next(file)
    values = re.search(r"OrderedDict\((.*)\)", line).group(1)
    mydict = collections.OrderedDict(ast.literal_eval(values))

答案 2 :(得分:0)

这不是一个好的解决方案,但它有效。 :)

#######################################
# String_To_OrderedDict
# Convert String to OrderedDict
# Example String
#    txt = "OrderedDict([('width', '600'), ('height', '100'), ('left', '1250'), ('top', '980'), ('starttime', '4000'), ('stoptime', '8000'), ('startani', 'random'), ('zindex', '995'), ('type', 'text'), ('title', '#WXR#@TU@@Izmir@@brief_txt@'), ('backgroundcolor', 'N'), ('borderstyle', 'solid'), ('bordercolor', 'N'), ('fontsize', '35'), ('fontfamily', 'Ubuntu Mono'), ('textalign', 'right'), ('color', '#c99a16')])"
#######################################
def string_to_ordereddict(txt):

    from collections import OrderedDict
    import re

    tempDict = OrderedDict()

    od_start = "OrderedDict([";
    od_end = '])';

    first_index = txt.find(od_start)
    last_index = txt.rfind(od_end)

    new_txt = txt[first_index+len(od_start):last_index]

    pattern = r"(\(\'\S+\'\,\ \'\S+\'\))"
    all_variables = re.findall(pattern, new_txt)

    for str_variable in all_variables:
        data = str_variable.split("', '")
        key = data[0].replace("('", "")
        value = data[1].replace("')", "")
        #print "key : %s" % (key)
        #print "value : %s" % (value)
        tempDict[key] = value

    #print tempDict
    #print tempDict['title']

    return tempDict

答案 3 :(得分:0)

以下是我在Python 2.7上的表现

from collections import OrderedDict
from ast import literal_eval

# Read in string from text file
myfile = open('filename.txt','r')
file_str = myfile.read()

# Remove ordered dict syntax from string by indexing
file_str=file_str[13:]
file_str=file_str[:-2]

# convert string to list
file_list=literal_eval(file_str)

header=OrderedDict()
for entry in file_list:
    # Extract key and value from each tuple
    key, value=entry
    # Create entry in OrderedDict
    header[key]=value

同样,您应该以不同的方式编写文本文件。