Python Pickle不存储数据

时间:2011-09-09 11:27:06

标签: python dictionary pickle

我有一个包含{姓名:电子邮件地址}

的字典

我有一个单独的.py来腌制这个:

emailDict = {'Kilizo': 'info%40kilizo.com' , 'about': 'about%40google.com' }


# write python dict to a file

output = open('orig.pkl', 'wb')
pickle.dump(emailDict, output)
output.close()

有效,因为它将原始字典腌制为orig.pkl

然后在我的主网站上,我有:

# Pickling # Deleting Old Temp & Creating New One
tmp = os.path.isfile("tmp.pkl")
if tmp == True:
        os.remove("tmp.pkl")
shutil.copyfile("orig.pkl", "tmp.pkl")

# Pickling # Loading File
pkl_file = open('tmp.pkl', 'rb')
emailDict = pickle.load(pkl_file)
pkl_file.close()

然后,我在网站上有两个表单输入,其中包含电子邮件地址和相应的名称

#Processing input
emailAdded = fs.getvalue('emailAdd')
nameAdded = fs.getvalue('nameAdd')
if  emailAdded != None or nameAdded != None:
    print emailAdded
    print nameAdded 
    emailDict[nameAdded] = emailAdded
else:
    print "Please enter a name & email address" 
output = open('tmp.pkl', 'wb')
pickle.dump(emailDict, output)
output.close()
print emailDict

但是,没有新数据存储到tmp.pkl或orig.pkl

让我开始的任何想法?

由于

3 个答案:

答案 0 :(得分:2)

  

让我开始的任何想法?

使用pickle作为网站的动态更新数据存储并不是很好。为了避免并发问题,您必须实现一个锁定文件机制,并希望访问该文件的所有其他内容都会尊重它。

我强烈建议您使用支持并发访问的数据存储。例如。数据库。

阅读:http://en.wikipedia.org/wiki/Concurrency_control


你可以用sqlite轻松开始。看到: http://docs.python.org/library/sqlite3.html

答案 1 :(得分:0)

MattH是对的,你绝对不应该使用pickle作为数据库替代品。我建议使用mongo这样的东西,因为它使存储字典变得轻而易举。我发现pymongo真的很容易使用,并且没有任何问题。

答案 2 :(得分:0)

python shelve模块负责为您提供类似字典的对象,但是当您提出要求时,它还会对文件进行pickle和存储。正如其他人所说,如果要经常更新,你想使用某种数据库,但为了便于使用,很难击败搁置模块。

http://docs.python.org/library/shelve.html