我正在试图弄清楚如何使用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上的解决方案和堆栈溢出。
答案 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