所以我是 python 新手,在整个学习过程中我很可能会问很多菜鸟问题(当然,如果他们还没有被问过/回答)。
我的一个问题是,是否有一种方法可以使用 pickle 将多个字典保存到一个文本文件中,或者是否必须将每个单独的字典保存到它自己的单独文件中。例如,如果我想创建一个程序来管理网络帐户,每个帐户都有各种任意键/值,我可以将所有这些单独的帐户作为单独的字典保存到一个存档中吗?
在此先感谢,菜鸟会欣赏示例代码和/或任何建议。
所以我是 python 新手,在整个学习过程中我很可能会问很多菜鸟问题(当然,如果他们还没有被问过/回答)。
我的一个问题是,是否有一种方法可以使用 pickle 将多个字典保存到一个文本文件中,或者是否必须将每个单独的字典保存到它自己的单独文件中。例如,如果我想创建一个程序来管理网络帐户,每个帐户都有各种任意键/值,我可以将所有这些单独的帐户作为单独的字典保存到一个存档中吗?
在此先感谢,菜鸟会欣赏示例代码和/或任何建议。
一种快速的解决方案是将两个字典放在一个列表中,然后腌制该列表。
这是一个将其写为二进制文件的示例。
import cPickle as pkl
MyFirstDict = { "hat": 7, "carpet": 5 }
MySecondDict = { "syrup":15, "yogurt": 18 }
MyDicts = [MyFirstDict, MySecondDict]
pkl.dump( MyDicts, open( "myDicts.p", "wb" ) )
这是加载它的一个。
import cPickle as pkl
myDicts = pkl.load( open ("myDicts.p", "rb") )
如果您需要该文件是人类可读的,请考虑将其写为常规文本文件。请注意,这效率要低得多,并且会使数据特别暴露给网络帐户数据之类的东西。
MyFirstDict = { "hat": 7, "carpet": 5 }
MySecondDict = { "syrup":15, "yogurt": 18 }
MyDicts = [MyFirstDict, MySecondDict]
outputFile = open( "myDicts.txt", "w")
outputFile.write(str(MyDicts))
outputFile.flush()
outputFile.close()
并把它读回来......
import ast
inputFile = open( "myDicts.txt", "r")
lines = inputFile.readlines()
objects = []
for line in lines:
objects.append( ast.literal_eval(line) )
myDicts = objects[0]
参考:
// 泡菜参考 http://wiki.python.org/moin/UsingPickle
// 文本到对象解决方案的来源 Python 将字符串对象转换为字典
有几种方法可以腌制多个对象。哪个最好取决于您的用例。
一种选择是将所有单独的帐户字典放入更大的数据结构中,例如列表或字典(可能由帐户 ID 键入)。然后你腌制更大的数据结构,账户数据将被一次性保存。请注意,Pickle 的格式是二进制,而不是文本。如果你想要一些人类可读的东西,你可能应该使用json
oryaml
代替。
另一种选择是按顺序将多个泡菜值写入文件。这几乎可以像您期望的那样工作,只需pickle.dump
反复调用以保存它们,然后pickle.load
反复将它们重新加载。这种方法的一个缺点是您无法轻松搜索所需的特定数据项,您需要继续按顺序加载它们,直到找到您想要的。另一个是多次腌制的对象的身份将丢失(加载它们时值可能相等,但不是对同一对象的引用)。一个优点是您可以将更多数据附加到文件的末尾,而无需读取以前的内容,只需再次将其写出即可。
第三种选择是使用shelve
标准库中的模块。它有点像字典,但键和值被腌制到文件中。它可以解决上述单独泡菜的查找问题,但不能解决值之间对象身份的丢失。
最后一个想法是根本不使用pickle,而是使用真正的数据库系统。这可能有点难以编码,但可以让您避免可能难以解决的并发性和数据完整性问题。