2011-09-26 67 views
-2

我設置了一個字典,從一個文件填充它,像這樣:Python程序處理字典像繩子

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

再後來我做了一個測試就可以了,就像這樣:

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

其中words[0]是一個用戶名字符串,但我得到了以下錯誤:

'str' object has no attribute 'get'

但我覈實ALRE ady在FILE.close()後面我有一本字典,它有正確的值。

任何想法是怎麼回事?

+0

更好的序列化方法是使用JSON:import json; json.FILE.write(json.dumps(filedusers)) - eval是各種邪惡的根源 –

+0

@Mikko,謝謝,這只是做一些基本的事情,所以我可以在重要的代碼上工作,沒有機會使用這個用於生產。 –

+0

但我可以保證json的工作,它是自Python 2.6以來stdlib的一部分:) –

回答

5

literal_eval接受一個字符串,並將其轉換爲一個python對象。因此,下列情況屬實......

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

但是,您正在添加一些不需要的引號。如果您的文件只是包含一個空字典({}),那麼您所創建的字符串應該是這樣的......

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

因此,解決方案是將該行更改爲...

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

......或者......

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

..depending你的文件格式。否則,由於引號,literal_eval會將您的字符串視爲ACTUAL字符串。

+0

如果我使用「僅支架」解決方案,我最終得到'格式錯誤的節點或字符串:'錯誤。更多信息:文件內容如'User1':Pass1,'User2':Pass2'。 –

+0

這是因爲現在字符串結束爲「{'User1':Pass1,'User2':Pass2}」,這是不正確的Python語法。 Pass1和Pass2也必須被引用,因爲它們是字符串。您需要更改文件格式,或使用其他方法來讀取它。 –

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

您沒有字典,它看起來像一個。你有一個字符串。

1

Python是動態類型化的:它不要求您將變量定義爲特定類型。它可以讓你隱式定義變量。你正在做的是將filedusers定義爲字典,然後通過將ast.literal_eval的結果賦值給它來重新定義它作爲字符串。

編輯:您需要刪除這些引號。 ast.literal_eval('"{}"')評估爲一個字符串。 ast.literal_eval('{}')評估爲字典。