我有兩個文件,我認爲它們就像數據庫的兩個表一樣。使用python對象查詢文件
他們考慮每種類型的python對象的字符串: {u'timestamp':1379941920.923155,u'code':u'xxx',u'code_id':u'xxx',u'greeting ':u'xxx'}
那麼,我該如何將它們轉換爲我可以使用並在python中查詢的東西。最好我想在'代碼'鍵上將它們交叉,但這是一條線。首先,我需要讓它們在我的python代碼中分析成對象。
我有兩個文件,我認爲它們就像數據庫的兩個表一樣。使用python對象查詢文件
他們考慮每種類型的python對象的字符串: {u'timestamp':1379941920.923155,u'code':u'xxx',u'code_id':u'xxx',u'greeting ':u'xxx'}
那麼,我該如何將它們轉換爲我可以使用並在python中查詢的東西。最好我想在'代碼'鍵上將它們交叉,但這是一條線。首先,我需要讓它們在我的python代碼中分析成對象。
這些字符串看起來是Python的字典的repr
。反過來或repr
通常是eval
,但在您不完全信任的數據上使用eval
可能不明智。這是因爲如果有人插入了像{u'code': __import__("os").system("rm -Rf /")}
這樣的行,它會嘗試刪除您的硬盤驅動器。 (不要試試這個!)
一個更安全的替代方法是ast.literal_eval
,其工作方式與eval
類似,但只處理字符串,列表和字典等文字(而不是函數調用!)。因此,一個基本的函數來獲取從文件字典的名單將是:
import ast
def read_dict_file(filename):
with open(filename) as f:
return [ast.literal_eval(line) for line in f]
至於做您的數據更多的處理,讓你把它像一個數據庫,我覺得這件事取決於如何大的數據集是多麼複雜,你想要做的是什麼。
如果它非常簡單並且您沒有太多數據,那麼您可以使用鍵入任何相關字段的字典來做一些簡單的事情,並獲得合理的結果。另一方面,如果你想對數據進行一些更復雜的處理,或者如果你有很多數據,那麼你應該把你的數據放在一個真正的數據庫中,並使用它已經測試過的和可擴展的API而不是寫自己的。 Python自帶sqlite3
(可能還有一些我不熟悉的自包含數據庫模塊),所以即使您有相當多的需求,也可能不需要安裝新軟件。
"{u'timestamp': 1379941920.923155, u'code': u'xxx', u'code_id': u'xxx', u'greeting': u'xxx'}"
是從打印Python dict
的repr()
以及他創建相同的dict
的litteral Python代碼中得到的結果。 完全不安全將其變回dict
的方法是使用eval()
,但這是你不應該這樣做的,真的。關於eval()
的三條黃金法則是:
現在你被警告。
由於語法是相當接近的JSON,您可以更放心地使用json.loads()
後的字符串一些簡單的預處理:
import json
# your original line of text:
line = "{u'timestamp': 1379941920.923155, u'code': u'xxx', u'code_id': u'xxx', u'greeting': u'xxx'}\n"
# making it proper json, quick&dirty way, likely to break on some other examples,
# would need a proper regexp
line = line.replace("u'", "'").replace("'", '"')
# and now let's make it a python `dict`:
mydict = json.loads(line)
Blckknght打敗了我,他的答案好得多。 –
您可以使用JSON模塊,以這種轉換。 – Naster
@Naster:你試過了嗎?這不是有效的json,它是帶有unicode鍵和值(Python 2.x很明顯)的Python的'repr()'。 –