簡體   English   中英

Python:如何將列表寫入文件,然后將其拉回 memory(dict 表示為字符串轉換為 dict)?

[英]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慢。

如其他答案所示,我會使用shelvejsonyaml等等。

shelve特別酷,因為你可以在磁盤上使用dict並仍然使用它。 值將按需加載。

但是如果你真的想要解析dict的文本,並且它只包含你已經顯示的strinttuple ,你可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM