Python有哪些好的临时存储和传输格式?

4 投票
4 回答
3367 浏览
提问于 2025-04-17 04:35

我正在用Python写一个脚本,这个脚本会输出一些数据,格式是一个字典的列表:

[{'name': 'first_thing', 'color': 'blue', 'flavour': 'watermelon' },
 {'name': 'second_thing', 'color': 'red' },
 {'name': 'third_thing', 'color': 'blue', 'size': 'huge!' }]

我在考虑把这些数据存储到文件里的方法。我的考虑因素有:

  1. 我希望存储和读取都很简单,这样我可以把数据加载回脚本中,继续处理。
  2. 我希望使用一种不依赖Python的格式。也许将来我想在PHP或者其他地方使用这些数据,谁知道呢?
  3. 我希望这个格式能方便地添加更多数据。如果我的文件里有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 则是这个语言的一个较小的子集,并且它有一些有用的标记,专门用于强大的跨语言自定义类的序列化。

撰写回答