[英]Python: How do I write a list to file and then pull it back into memory (dict represented as a string convert to dict) later?
更具體的875228 復制品——簡單數據存儲在 Python 中。
我有一個相當大的字典(6 GB),我需要對其進行一些處理。 我正在嘗試幾種文檔聚類方法,因此我需要立即將所有內容都放入 memory 中。 我還有其他功能可以在此數據上運行,但內容不會改變。
目前,每當我想到新功能時,我都必須編寫它們,然后重新生成 dict。 我正在尋找一種將此字典寫入文件的方法,以便我可以將它加載到 memory 而不是重新計算它的所有值。
過度簡化它看起來像這樣的東西:{((('word','list'),(1,2),(1,3)),(...)):0.0, ....}
我覺得 python 一定有比我循環遍歷一些字符串尋找 : 和 ( 試圖將其解析到字典中更好的方法。
為什么不使用python pickle ? Python有一個很棒的序列化模塊叫做pickle,它很容易使用。
import cPickle
cPickle.dump(obj, open('save.p', 'wb'))
obj = cPickle.load(open('save.p', 'rb'))
泡菜有兩個缺點:
如果您使用的是python 2.6,則會有一個名為json的內置模塊。 它就像泡菜一樣簡單:
import json
encoded = json.dumps(obj)
obj = json.loads(encoded)
Json格式是人類可讀的,與python中的字典字符串表示非常相似。 而且沒有像泡菜這樣的安全問題。 但可能比cPickle慢。
如其他答案所示,我會使用shelve
, json
, yaml
等等。
shelve
特別酷,因為你可以在磁盤上使用dict
並仍然使用它。 值將按需加載。
但是如果你真的想要解析dict
的文本,並且它只包含你已經顯示的str
, int
和tuple
,你可以使用ast.literal_eval
來解析它。 這是一個很多更安全,因為你不能用它的eval充分表達-它僅適用於str
英格斯,數字, tuple
S, list
S, dict
S, bool
是指合同和None
:
>>> import ast
>>> print ast.literal_eval("{12: 'mydict', 14: (1, 2, 3)}")
{12: 'mydict', 14: (1, 2, 3)}
我建議您使用YAML作為文件格式,以便在光盤上修改它
How does it look:
- It is indent based
- It can represent dictionaries and lists
- It is easy for humans to understand
An example: This block of code is an example of YAML (a dict holding a list and a string)
Full syntax: http://www.yaml.org/refcard.html
要在python中獲取它,只需easy_install pyyaml。 見http://pyyaml.org/
它帶有簡單的文件保存/加載功能,我記不清楚這一分鍾。
以下是一些替代方案,具體取決於您的要求:
numpy
以簡潔的形式存儲您的簡單數據,並很好地執行組/批量操作
shelve
就像一個由文件支持的大型字典
某些第三方存儲模塊,例如stash
,存儲任意明文數據
適當的數據庫,例如用於毛發數據或mysql或sqlite普通數據的mongodb和更快的檢索
SourceForge上的此解決方案僅使用標准Python模塊:
y_serial.py module ::使用SQLite倉庫Python對象
“序列化+持久性::在幾行代碼中,將Python對象壓縮並注釋為SQLite;然后通過關鍵字按時間順序檢索它們,而不使用任何SQL。最有用的”標准“模塊,用於存儲無模式數據的數據庫。”
http://yserial.sourceforge.net
壓縮加值可能會將您的6GB字典減少到1GB。 如果您不希望商店出現一系列詞典,該模塊還包含一個file.gz解決方案,根據您的字典大小,該解決方案可能更合適。
對於 Unicode 個字符,請使用:
data = [{'key': 1, 'text': 'some text'}]
f = open(path_to_file, 'w', encoding='utf8')
json.dump(data, f, ensure_ascii=False)
f.close()
f = open(path_to_file, encoding="utf8")
data = json.load(f)
print(data)
[{'key': 1, 'text': 'some text'}]
以序列化格式寫出來,例如pickle(用於序列化的python標准庫模塊),或者可能使用JSON(這是一種可以被喚醒以再次產生內存表示的表示)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.