在python中将数据结构持久保存到文件的最简单方法?

Blo*_*ard 34 python persistence file

假设我有这样的事情:

d = { "abc" : [1, 2, 3], "qwerty" : [4,5,6] }
Run Code Online (Sandbox Code Playgroud)

什么是最简单的方法,以程序方式将 其转换为我以后可以从python加载的文件?

我可以以某种方式将其保存为python源(从python脚本中,而不是手动!),然后import它呢?

或者我应该使用JSON还是其他什么?

eco*_*sis 61

使用pickle模块.

import pickle
d = { "abc" : [1, 2, 3], "qwerty" : [4,5,6] }
afile = open(r'C:\d.pkl', 'wb')
pickle.dump(d, afile)
afile.close()

#reload object from file
file2 = open(r'C:\d.pkl', 'rb')
new_d = pickle.load(file2)
file2.close()

#print dictionary object loaded from file
print new_d
Run Code Online (Sandbox Code Playgroud)

  • 路径前面的 r 是什么意思? (2认同)
  • r''表示原始字符串,如下所述:http://docs.python.org/reference/lexical_analysis.html#string-literals.基本上,它意味着字符串中的反斜杠包含为文字反斜杠,而不是字符转义(尽管原始字符串不能以反斜杠结尾). (2认同)
  • 技术上酸洗将适用于文本模式文件,只要你没有使用二进制pickle格式(即.protocol = 0)并且你一直使用它(即也使用文本模式进行回读).但是,使用二进制文件通常是一个更好的主意,特别是如果您可以在平台之间移动数据 (2认同)

Mil*_*les 15

您可以选择:Python标准库 - 数据持久性.哪一个最合适可能因您的具体需求而异.

pickle 就"将任意对象写入文件并恢复它"而言,它可能是最简单和最有能力的 - 它可以自动处理自定义类和循环引用.

为了获得最佳的酸洗性能(速度和空间),使用cPickleHIGHEST_PROTOCOL.


mha*_*wke 7

尝试搁置模块,它将为您提供持久字典,例如:

import shelve
d = { "abc" : [1, 2, 3], "qwerty" : [4,5,6] }

shelf = shelve.open('shelf_file')
for key in d:
    shelf[key] = d[key]

shelf.close()

....

# reopen the shelf
shelf = shelve.open('shelf_file')
print(shelf) # => {'qwerty': [4, 5, 6], 'abc': [1, 2, 3]}
Run Code Online (Sandbox Code Playgroud)


小智 5

JSON有故障,但是当它满足您的需求时,它也是:

  • 使用简单
  • 作为模块包含在标准库中json
  • 与相似的界面pickle,可以处理更复杂的情况
  • 可人工编辑的文本,用于调试,共享和版本控制
  • 有效的Python代码
  • 在网络上建立良好的渠道(如果您的程序涉及该域中的任何一个)

  • JSON不是有效的Python。从表面上看,它看起来是这样,但是使用一些布尔值,您会看到问题(JSON使用true和false,而Python使用True和False)。另外:JSON数组(字典)仅具有字符串键。因此,它不能正确保留数据结构。 (5认同)

Jay*_*son 5

您可能还想了解一下变得更复杂的Zope对象数据库:-)可能对您所拥有的内容过于了解,但它的伸缩性很好,并且使用起来并不难。