4 votes

Conversion de chaîne de caractères en OrderedDict en python

J'ai créé un dictionnaire ordonné en python en important des collections et je l'ai stocké dans un fichier nommé 'nomfichier.txt'. Le contenu du fichier ressemble à ceci

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

J'ai besoin d'utiliser cet OrderedDict depuis un autre programme. Je le fais de la façon suivante

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

J'ai besoin d'obtenir 'mydict' à partir de Type

<class 'collections.OrderedDict'>

mais ici, il s'avère être de type 'str'.
Existe-t-il un moyen de convertir un type de chaîne de caractères en type OrderedDict en Python 2.7 ?

7voto

wong2 Points 7158

Vous pouvez le stocker et le charger avec cornichon

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

6voto

Lattyware Points 37257

La meilleure solution ici est de stocker vos données d'une manière différente. Encodez-le en JSON par exemple.

Vous pouvez également utiliser el pickle module comme expliqué dans d'autres réponses, mais cela présente des problèmes de sécurité potentiels (comme expliqué avec eval() ci-dessous) - n'utilisez donc cette solution que si vous savez que les données seront toujours fiables.

Si vous ne pouvez pas modifier le format des données, il existe d'autres solutions.

La très mauvaise solution consiste à utiliser eval() pour le faire. C'est un realmente realmente mauvaise idée car elle n'est pas sécurisée, car tout code placé dans le fichier sera exécuté, ainsi que autres raisons

La meilleure solution consiste à analyser manuellement le fichier. L'avantage est qu'il existe un moyen de tricher et de le faire un peu plus facilement. Python a ast.literal_eval() qui vous permet d'analyser facilement les littéraux. Bien que ce ne soit pas un littéral puisqu'il utilise OrderedDict, nous pouvons extraire le littéral de la liste et l'analyser.

Par exemple : (non testé)

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

0voto

Guray Celik Points 153

Ce n'est pas une bonne solution mais elle fonctionne :)

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

0voto

oogieoogieful Points 13

Voici comment je l'ai fait sur 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

Encore une fois, vous devriez probablement écrire votre fichier texte différemment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X