Python有哪些好的临时存储和传输格式?
我正在用Python写一个脚本,这个脚本会输出一些数据,格式是一个字典的列表:
[{'name': 'first_thing', 'color': 'blue', 'flavour': 'watermelon' },
{'name': 'second_thing', 'color': 'red' },
{'name': 'third_thing', 'color': 'blue', 'size': 'huge!' }]
我在考虑把这些数据存储到文件里的方法。我的考虑因素有:
- 我希望存储和读取都很简单,这样我可以把数据加载回脚本中,继续处理。
- 我希望使用一种不依赖Python的格式。也许将来我想在PHP或者其他地方使用这些数据,谁知道呢?
- 我希望这个格式能方便地添加更多数据。如果我的文件里有1000个字典项,我不想为了在最后添加一个新项而把所有1000个都加载到内存里。
我第一次尝试使用Pickle,它在简单性上符合要求,但它依赖于Python,我得先解包、添加,然后再打包。
我想到的其他看起来可行的格式(以及我的一些顾虑):
- JSON(添加数据可能会很麻烦)
- Shelve(依赖于Python)
- CSV(就像用胶带粘起来的,不太高档,但可能能用)
- 某种轻量级数据库,比如sqlite(可能有点过于复杂了)
有没有人对这些格式或者其他格式有什么看法?
4 个回答
1
在大多数情况下,我认为使用JSON是最好的选择。
你可以用simplejson把你的字典列表转换成JSON,这样做非常简单:
import simplejson as json
my_list = [{'name': 'first_thing', 'color': 'blue', 'flavour': 'watermelon'}, {'name': 'second_thing','color': 'red' }, {'name': 'third_thing', 'color': 'blue', 'size': 'huge!'}]
output = json.dumps(my_list, ident=4)
转换后的JSON结果是:
[
{
"color": "blue",
"flavour": "watermelon",
"name": "first_thing"
},
{
"color": "red",
"name": "second_thing"
},
{
"color": "blue",
"name": "third_thing",
"size": "huge!"
}
]
现在,这个JSON字符串是完全有效的。
它是一个JSON数组。所以我觉得你不需要去做什么特别的处理来去掉“[”和“]”。因为你是把一个Python列表传给simplejson,所以你会得到一个JSON列表作为结果。
2
使用Pickle应该没问题。直接存储字典(不要放在列表里),这样添加数据会更简单:
>>> from pickle import dump, load
>>> f = open('stor.bin', 'w')
>>> dump(dict(a=1), f)
>>> dump(dict(b=2), f)
>>> dump(dict(c=3), f)
>>> f.close()
在后续的会话中,可以直接在文件末尾添加另一个dump():
>>> f = open('store.bin', 'a')
>>> dump(dict(d=4), f)
>>> f.close()
读取的时候,只需要反复使用load(),直到到达文件的末尾:
>>> f = open('stor.bin', 'r')
>>> load(f)
{'a': 1}
>>> load(f)
{'b': 2}
>>> load(f)
{'c': 3}
>>> load(f)
{'d': 4}
>>> load(f)
Traceback (most recent call last):
...
EOFError
1
根据你需要后续添加数据的需求,YAML 可能是你想要的格式。它特别设计用来支持像日志文件那样可以不断添加数据的元素,而 JSON 则是这个语言的一个较小的子集,并且它有一些有用的标记,专门用于强大的跨语言自定义类的序列化。