2013-12-19 63 views
0

我有兩個文件,我認爲它們就像數據庫的兩個表一樣。使用python對象查詢文件

他們考慮每種類型的python對象的字符串: {u'timestamp':1379941920.923155,u'code':u'xxx',u'code_id':u'xxx',u'greeting ':u'xxx'}

那麼,我該如何將它們轉換爲我可以使用並在python中查詢的東西。最好我想在'代碼'鍵上將它們交叉,但這是一條線。首先,我需要讓它們在我的python代碼中分析成對象。

+1

您可以使用JSON模塊,以這種轉換。 – Naster

+0

@Naster:你試過了嗎?這不是有效的json,它是帶有unicode鍵和值(Python 2.x很明顯)的Python的'repr()'。 –

回答

2

這些字符串看起來是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(可能還有一些我不熟悉的自包含數據庫模塊),所以即使您有相當多的需求,也可能不需要安裝新軟件。

0

"{u'timestamp': 1379941920.923155, u'code': u'xxx', u'code_id': u'xxx', u'greeting': u'xxx'}"是從打印Python dictrepr()以及他創建相同的dict的litteral Python代碼中得到的結果。 完全不安全將其變回dict的方法是使用eval(),但這是你不應該這樣做的,真的。關於eval()的三條黃金法則是:

  1. 不使用它
  2. 不使用它
  3. 只有高級程序員:不使用它。

現在你被警告。

由於語法是相當接近的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) 
+0

Blckknght打敗了我,他的答案好得多。 –