我通过导入集合创建了一个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
答案 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
同样,您应该以不同的方式编写文本文件。