尝试在Python中添加用pickle保存的数据

时间:2017-08-24 10:27:47

标签: python python-3.x pickle

我正在试图弄清楚如何使用Python中的pickle在已保存的数据中添加数据

import pickle
load_written_things = open("written_things.pkl", "rb")
added_stuff = input("write:")
written_things = pickle.load(load_written_things)  +  pickle.dump(added_stuff, open("written_things.pkl", "wb"))                                                          
print (written_things)

我之前创建了write_things.pkl,我已经在其中写了一些内容,而我正在为其他人编写代码。现在我想添加一些东西,一个erron似乎在说EOFError:输入输出。我曾多次尝试以不同的方式添加内容,但我无法找到方法,我在搜索youtube上的解决方案和堆栈溢出。

2 个答案:

答案 0 :(得分:0)

您可以尝试以下方法:

import pickle

load_written_things = open("written_things.pkl", "rb")
added_stuff = raw_input("write: ")
written_things = pickle.load(load_written_things)  +  added_stuff

pickle.dump(written_things, open("written_things.pkl", "wb"))                                                          
print (written_things)
  

第二个问题的更新:

好吧,让我们说你已经在'write_things.pkl'中删除了一个初始列表。像这样:

#!/usr/bin/env python

import pickle

# initial list dumped in 'written_things.pkl'
alist = ['name1', 'name2', 'name3']
with open('written_things.pkl', 'wb') as f: pickle.dump(alist,f)

现在,如果我理解正确,您希望使用新项目更新此列表,并将新列表/结果转储到' written_things.pkl'使用pickle。 一种方法是:

# old stuff
load_written_things = open("written_things.pkl", "rb")
old = pickle.load(load_written_things)

new_item = raw_input('>> New item: ')
with open("written_things.pkl", "w") as f:  
    pickle.dump(old+[new_item], f)

# to read back the data
with open("written_things.pkl", "rb") as f:
    data = pickle.load(f)

另外请记住,通过这种方式,我们一次添加一个项目。因此,如果您想一次输入多个项目,可以输入以下项目: item1,item2,item3等...(或任何其他分隔符),然后替换行:

pickle.dump(old+[new_item], f) --with - > pickle.dump(old+new_item.split(','), f)

另一个需要考虑的问题是here,其中pickle模块对于错误或恶意构造的数据不安全。 这意味着您必须确保.pkl文件中的数据不是恶意的。野外有许多技术允许使用python的pickle 任意代码执行

作为pickle的替代方案,您始终可以将输出(可能是列表,字典等...)放在文件中,然后使用ast.literal_eval来回读数据。如模块本身和here所述, ast.literal_eval被认为是安全的。

答案 1 :(得分:0)

请尝试以下操作。

import pickle

added_stuff = raw_input("write:")
pickle.dump(added_stuff, open("written_things.pkl","a"))                                                          

print added_stuff

基本上,这会将您的输入附加到written_things.pkl。

〜使用python 2.7.6