2011-09-26 3 views
-2

j'ai créé un dictionnaire, et rempli d'un fichier, comme ceci:programme Python dictionnaire traiter comme une chaîne

filedusers = {} # cheap way to keep track of users, not for production 
FILE = open(r"G:\School\CS442\users.txt", "r") 
filedusers = ast.literal_eval("\"{" + FILE.readline().strip() + "}\"") 
FILE.close() 

puis plus tard, je l'ai fait un test, comme ceci:

if not filedusers.get(words[0]):

words[0] est une chaîne pour un nom d'utilisateur, mais je reçois l'erreur suivante:

'str' object has no attribute 'get'

mais je ALRE vérifié Après le FILE.close() j'ai eu un dictionnaire, et il avait les valeurs correctes dedans.

Une idée de ce qui se passe?

+0

Une meilleure façon de sérialiser serait d'utiliser JSON: import json; json.FILE.write (json.dumps (filedusers)) - eval est la racine de toutes sortes de mal –

+0

@Mikko, merci, c'est juste de faire quelque chose de base afin que je puisse travailler sur le code important, aucune chance d'utiliser ce pour la production. –

+0

Mais je peux garantir que json fonctionne et il fait partie de stdlib depuis Python 2.6 :) –

Répondre

5

Donc, ce qui suit est vrai ...

ast.literal_eval('{"a" : 1}') 
>> {'a' : 1} 

Cependant, vous ajoutez des citations qui ne sont pas nécessaires. Si votre fichier contient simplement un dictionnaire vide ({}), la chaîne vous créez ressemblerait à ceci ...

ast.literal_eval('"{}"') # The quotes that are here make it return the string "{}" 
>> '{}' 

Ainsi, la solution serait de changer la ligne ...

ast.literal_eval("{" + FILE.readline().strip() + "}") 

... ou ...

ast.literal_eval(FILE.readline().strip()) 

..depending sur votre mise en page de fichier. Sinon, literal_eval voit votre chaîne comme une chaîne ACTUAL à cause des guillemets.

+0

Je finis par obtenir l'erreur 'noeud ou chaîne malformée:' si j'utilise la solution 'bracket-only'. Plus d'infos: contenu du fichier comme "User1": Pass1, "User2": Pass2'. –

+0

C'est parce que maintenant la chaîne finit par être "{'User1': Pass1, 'User2': Pass2}", ce qui n'est pas la syntaxe correcte de Python. Pass1 et Pass2 doivent être également indiqués car ce sont des chaînes. Vous devez modifier le format de fichier ou utiliser une méthode différente pour le lire. –

3
>>> import ast 
>>> username = "asd: '123'" 
>>> filedusers = ast.literal_eval("\"{" + username + "}\"") 
>>> print filedusers, type(filedusers) 
{asd} <type 'str'> 

Vous n'avez pas de dictionnaire, il ressemble à un dictionnaire. Vous avez une chaîne.

1

Python est typé dynamiquement: il ne vous oblige pas à définir des variables comme un type spécifique. Et cela vous permet de définir des variables implicitement. Qu'est-ce que vous faites est de définir filedusers comme un dictionnaire, puis redéfinir comme une chaîne en lui assignant le résultat de ast.literal_eval.

EDIT: Vous devez supprimer ces guillemets. ast.literal_eval('"{}"') évalue à une chaîne. ast.literal_eval('{}') évalue à un dictionnaire. Literal_eval prend une chaîne et la convertit en objet python.

Questions connexes