什么是一个很好的临时存储& Python的传输格式?

时间:2011-10-19 03:03:30

标签: python file-io storage

我正在用Python编写一个脚本,它会将一些数据组织成一个dicts列表:

[{'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个小dict项目的列表,我不想将所有1000个加载到内存中,只是为了再添加一个项目。
  4. 我的第一次尝试是使用Pickle,它符合简单的标准,但它依赖于Python,我必须进行unpickle,追加,然后重新制作。

    我认为似乎可行的其他格式(我的反对意见):

    • JSON(追加可能会很烦人)
    • Shelve(特定于python)
    • CSV(就像胶带一样,不是那么优雅,但它可能会起作用)
    • 像sqlite这样的轻型数据库(可能在这里过于花哨)

    任何人都有这些或其他格式的论据吗?

4 个答案:

答案 0 :(得分:2)

Pickle应该可以正常工作。 直接存储dicts(不在列表中)以使附加更容易:

>>> 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 :(得分:1)

鉴于您需要稍后添加数据,YAML可能是您正在寻找的格式。它被明确地设计为支持附加数据元素和日志文件,json故意是该语言的正确子集,并且它具有一些有用的元标记,用于自定义类的强大跨语言序列化。

答案 2 :(得分:1)

对于大多数情况,我认为JSON应该是你最好的选择。

使用simplejson将dict的列表转换为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字符串。

这是一个JSON array。所以我认为你不需要删除“[”和“]”。由于您将python列表传递给simplejson,因此返回JSON列表。

答案 3 :(得分:0)

从您的示例数据片段来看,您的数据看起来确实比更复杂的格式更适合表格格式。如果您的dicts的密钥是事先已知的,并且在每个条目中使用,我认为CSV是正确的选择。 Python还有一个csv模块,可以让它变得更容易。