【问题标题】:use pickle to save dictionary in python使用pickle在python中保存字典
【发布时间】:2014-07-31 07:21:22
【问题描述】:

我有一个文件hash_db.pickle,当我创建它时,我在上面保存了一本字典:

v = {hash_value:{"file name":file_name,"file size":file_size,"last scanned time":scanned_time}}

{123dfre345:{"file name":calc.pdf,"file size":234,"last scanned time":12:23 24/12/2013}}
{3gcdshj754:{"file name":star.pdf,"file size":10,"last scanned time":10:30 10/10/2013}}

所以如果我只想从文件中更改last scanned time3gcdshj754

我该怎么做?

【问题讨论】:

标签: python pickle


【解决方案1】:

使用pickle很简单,写的时候用

dct = {'3gcdshj754': {'file name': 'star.pdf', 'last scanned time': '10:30 10/10/2014', 'file size': '10'}}

import pickle
pickle.dump(dct, open("save.p", "wb"))

然后,在阅读时,使用

import pickle
dct_read = pickle.load(open("save.p", "rb"))

请注意,无论何时,您都必须以二进制模式 (b flag) 打开文件。

现在编辑内容很简单:

dct_read.values()[0]["last scanned time"] = '10:10 10/10/2010'

或者,正如@mhawke 在his answer 中建议的那样,您可以使用shelve

【讨论】:

  • 它给了我一个错误 "dct_read.values(0)['lastscanned time'] = '10:10 10/10/2010' TypeError: values() 不接受任何参数(1 给定) "
  • 那太好了,谢谢...如果可以的话,我想问另一个问题。如果我在“save.p”文件中有很多条目,并且我想根据第一个数字(如“3gcdshj754”)进行编辑,我认为它是一个哈希值
  • @user3832061 然后作为另一个问题问:)
【解决方案2】:

您可以使用pickle

import pickle
d = pickle.load(open('hash_db.pickle', 'rb'))
d['3gcdshj754']['last scanned time'] = '11:30 11/10/2015'
pickle.dump(d, open('hash_db.pickle', 'wb'))

但您可能会发现shelve 模块比直接使用pickle 更方便一些。它提供了一个持久字典,这似乎正是您想要的。示例用法:

import shelve
from datetime import datetime, timedelta

# create a "shelf"
shelf = shelve.open('hash_db.shelve')
shelf['123dfre345'] = {"file name": 'calc.pdf', "file size": 234, "last scanned time": datetime(2013, 12, 24, 12, 23)}
shelf['3gcdshj754'] = {"file name": 'star.pdf', "file size": 10, "last scanned time": datetime(2013, 10, 10, 10, 30)}
shelf.close()

# open, update and close
shelf = shelve.open('hash_db.shelve')
file_info = shelf['3gcdshj754']
file_info['last scanned time'] += timedelta(hours=+1, minutes=12)
shelf['3gcdshj754'] = file_info
shelf.close()

就是这样。

【讨论】:

  • 但是如果我想读取和打印所有的 'hash_db.shelve' 文件怎么办?
  • @user3832061 :架子就像一本字典,因此适用普通的字典功能,例如shelf.keys()shelf.items()
  • 我可以用这个吗:shelf = shelve.open('hash_db.shelve') strings = re.findall(hash_value,shelf)
  • 你尝试的时候发生了什么?您想找到与正则表达式匹配的那些键(hash_value)吗?这样的事情可能会工作[(k,v) for k,v in shelf.items() if re.match(pattern, k)]。但请注意,这似乎没有用 - 在哈希集合中不会有任何可识别的模式,正则表达式对其有用。
  • 如果有hash_value,直接查就好。 shelf[hash_value] 将返回包含文件信息的字典。
猜你喜欢
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多