2016-02-27 65 views
-1

我對python和一般編碼頗爲陌生。 我正在爲俄羅斯社交網絡(vk.com)編寫我自己的聊天統計信息機器人。如何在文件中存儲字典?

我的問題是我可以在文件中存儲字典並使用它?

例如:

Userlist=open('userlist.txt', '+') 
If lastmessage['uid'] not in Userlist.read(): 
    Userlist.read()[lastmessage.'uid']=1 
Userlist.close() 

還是我不得不用這樣的JSON一些端模塊?

謝謝

+0

所以,你正在尋找一個文件中存儲的字典,然後再讀回到你的代碼以後使用? – idjaw

+0

使用'json'非常簡單。 'obj = json.load(f)'讀取,'json.dump(obj,f)'保存 –

+2

你可以'pickle'任何python結構。 – roadrunner66

回答

3

(Ammended答案澄清評論的光:的同時實現真正的週期我要檢查,如果用戶的ID是「用戶列表」字典(如鑰匙),如果沒有,添加然後我想用一個新的字典重寫文件,在程序啓動後立即打開文件,在週期前):

爲了在磁盤上穩健地使用數據它是一本字典,您應該考慮dbm模塊或僅使用SQLite3支持。

A dbm文件只是一組鍵和值,透明地維護和使用索引。一旦你打開了你的dbm文件,你就可以像使用任何其他Python字典一樣使用它(用字符串作爲鍵)。在關閉文件之前,可以簡單地刷新和寫入任何更改。這很簡單,雖然它沒有提供鎖定的特殊功能(或者在可能有多個進程同時寫入文件的情況下管理一致性)等等。

另一方面,多年來一直包含在Python標準庫中的令人難以置信的強大的SQLite子系統允許您輕鬆將一組本地文件當作SQL數據庫管理系統來處理......所有基於客戶機/服務器的系統(外鍵,數據類型和參照完整性約束管理,視圖和觸發器,索引等)所期望的功能。

在你的情況下,你可以只有一個包含單個列的表。綁定到該數據庫(通過其文件名)將允許您使用SELECT查詢用戶的名稱,並使用INSERT添加該用戶的名稱。隨着應用程序的增長和更改,您可以添加其他列以跟蹤帳戶何時創建以及何時最近使用或檢查(多個時間/日期戳記列),並且可以使用相關數據創建其他表(使用JOIN , 例如)。

(原來的答覆):

通常存儲任何內部數據結構作爲一個文件,或通過網絡連接發送它的處理中,被稱爲「序列」。加載或接收這種數據並將其內容實例化爲新的數據結構的補充過程被稱爲(「不出所料」)「反序列化」。

所有編程語言都是如此。

有很多方法可以在Python中序列化和反序列化數據。特別是我們有本地(標準庫)pickle模塊,它生成的文件(或字符串)只能用於運行Python的其他進程或與其他進程一起使用,或者我們可以使用JSON ...已成爲JavaScript對象表示法事實上的跨語言數據結構序列化標準。 (還有其他的如YAML和XML ......但JSON已經佔據主導地位)。

關於使用JSON和Pickle的警告是JavaScript(和許多其他編程和腳本語言對Python的某些「字典」(關聯數組)鍵使用不同的語義,特別是Python(和Ruby和Lua)將諸如「1」(包含數字「1」的字符串)和1或1.0(數字值等於1)的鍵作爲不同的鍵處理。JavaScript,Perl和一些其他人將鍵視爲「標量」值這些字符串像「1」和數字1將評估到相同的密鑰

還有一些細微差別可以影響你的序列化的保真度,但這是最容易理解的字符串作爲鍵的字典都很好數字和字符串鍵的混合是最可能的原因使用JSON序列化/反序列化代替酸洗會遇到麻煩。

+0

非常感謝。 只要這是用戶列表,鍵將是字符串。 – Warpony

+0

儘管我沒有明確提到它,但我想指出,使用dbm或SQLite文件將允許您有效地使用遠大於可用內存的數據集。正如我所說的,dbm文件自動編入索引,您可以在SQLite數據上創建索引,然後以完全透明的方式進行維護......只要您的代碼添加,刪除或修改數據,就會被庫隱式地保存。 –

+0

偉大的答案@JimDennis。很徹底。 – idjaw