字符串在Python OrderedDict转换(string to OrderedDict con

2019-09-17 02:10发布

我已经通过导入集合创建一个python有序字典,并将其存储在一个名为“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

Answer 1:

你可以存储,并与加载它泡菜

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'>


Answer 2:

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

你也可以使用的pickle模块在其他的答案解释,但这有潜在的安全问题(如解释eval()下) -前提是您必须知道的是,数据总是要被信任使用此解决方案。

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

真正糟糕的解决方案是使用eval()来做到这一点。 这是一个非常 非常糟糕主意,因为它是不安全的,因为把文件中的任何代码都将运行,连同其他原因

更好的解决方案是手动解析文件。 有利的一面是,有你可以在这个欺骗和多一点很容易做到这一点的方式。 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))


Answer 3:

这不是一个很好的解决方案,但它的工作原理。 :)

#######################################
# 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


Answer 4:

以下是我做这件事是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

再次,你应该写不同的文本文件。



文章来源: string to OrderedDict conversion in python