4

我通过导入集合创建了一个 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

4 回答 4

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'>
于 2012-05-08T12:44:51.797 回答
6

这里最好的解决方案是以不同的方式存储您的数据。例如,将其编码为 JSON

您也可以按照其他答案中的说明使用pickle模块,但这存在潜在的安全问题(eval()如下所述) - 因此,如果您知道数据始终是可信的,请仅使用此解决方案。

如果你不能改变数据的格式,那么还有其他的解决方案。

真正糟糕的解决方案是使用它eval()来执行此操作。这是一个非常 糟糕的主意,因为它不安全,因为放入文件中的任何代码都会运行,以及其他原因

更好的解决方案是手动解析文件。好处是有一种方法可以让你在这方面作弊并且更容易做到这一点。Pythonast.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))
于 2012-05-08T12:47:00.173 回答
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
于 2014-11-27T19:59:13.237 回答
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

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

于 2016-08-23T17:32:22.203 回答