什么';这是一个很好的临时仓库;Python的传输格式?

什么';这是一个很好的临时仓库;Python的传输格式?,python,file-io,storage,Python,File Io,Storage,我正在用Python编写一个脚本,它将吐出一些按DICT列表组织的数据: [{'name': 'first_thing', 'color': 'blue', 'flavour': 'watermelon' }, {'name': 'second_thing', 'color': 'red' }, {'name': 'third_thing', 'color': 'blue', 'size': 'huge!' }] 我正试图决定一种将这些数据存储在文件中的方法。我的考虑: 我希望它读起来和写

我正在用Python编写一个脚本,它将吐出一些按DICT列表组织的数据:

[{'name': 'first_thing', 'color': 'blue', 'flavour': 'watermelon' },
 {'name': 'second_thing', 'color': 'red' },
 {'name': 'third_thing', 'color': 'blue', 'size': 'huge!' }]
我正试图决定一种将这些数据存储在文件中的方法。我的考虑:

  • 我希望它读起来和写起来一样简单,这样我就可以将数据加载回脚本并进一步操作它
  • 我希望它是非python特定的格式。也许以后我会想在PHP中使用这些数据,谁知道呢
  • 我希望它是一种易于附加更多数据的格式。如果我的文件有一个包含1000个我的小dict项目的列表,我不想将所有1000个项目都加载到内存中,只是为了在末尾再添加一个项目
  • 我的第一次尝试是使用Pickle,它符合简单的标准,但它依赖于Python,我必须先取消Pickle、追加,然后重新Pickle

    我认为其他形式似乎可行(我反对):

    • JSON(附加可能会很烦人)
    • 搁置(特定于python)
    • CSV(就像管道胶带一样,虽然不那么经典,但可能会有用)
    • 像sqlite这样的轻量级数据库(这里可能太花哨了)

    有人对这些格式或其他格式有参数吗?

    从您的示例数据片段来看,您的数据似乎更适合表格格式,而不是更复杂的格式。如果您的dicts的键是事先知道的,并且在每个条目中都使用,我认为CSV是正确的选择。Python还提供了一个csv模块来简化这一过程。

    考虑到您以后需要追加数据,这可能是您正在寻找的格式。它被明确地设计为支持日志文件中附加的数据元素,json是该语言的一个适当子集,并且它有一些有用的元标记,用于定制类的强大跨语言序列化

    对于大多数情况,我认为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)
    
    结果将是:

    [
        {
            "color": "blue",
            "flavour": "watermelon",
            "name": "first_thing"
        },
        {
            "color": "red",
            "name": "second_thing"
        },
        {
            "color": "blue",
            "name": "third_thing",
            "size": "huge!"
        }
    ]
    
    现在,这个JSON是一个非常有效的JSON字符串

    这是一个好主意。所以我不认为你需要做一个黑客来删除“[”和“]”。由于您正在将python列表传递给simplejson,您将得到一个JSON列表。

    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()   
    
    >>> 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
    
    要读取,只需重复执行load(),直到到达文件末尾:

    >>> f = open('store.bin', 'a')
    >>> dump(dict(d=4), f)
    >>> f.close()   
    
    >>> 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
    


    你看过XML吗?您可以创建自己的模式,并将其作为使用您输出的数据的所有程序的标准。虽然XML非常大,但它非常适合跨语言/平台的东西。我没有考虑过XML。这当然是一种跨平台的格式。有没有一种方法可以像pickle.dump()那样简单地编写它?我从来没有尝试过用python编写XML,但它应该有一两个库,它不会像pickle那么简单,而且可能比CSV更精细,尝试一个好的开始。我刚刚想起了这个问题。。。很多年后,我有了更多的经验,我可能会建议自己使用jsonl()。我想我有点懒,我不想跟踪所有的键。。。我的真实数据实际上比我的例子要混乱得多。不是不可逾越的,我可能最终会这么做,但仍然没有完全被说服。到底有多混乱,以什么样的方式?你能再充实一下你的数据描述吗?会有一个固定的列表,包含15个左右的字段,任何给定的项目都会有两个到所有的字段。而且,你的乐高名牌也很棒!(看了看你的个人资料)我在想圣诞礼物……关于名牌,谢谢!:)至于你的数据,听起来并不是那么凌乱。。。是否有可能某些经理类型需要访问此数据?他们倾向于喜欢Excel,而.csv将适用于该用例,而其他人则不会。单独的文档可以组成一个流。跨平台。容易的。宾果。除了单独的文档之外,我发现一个长文档是一个多行列表(每个条目以“-”开头),只要每个条目的数据保持在一行,就可以很容易地添加到该列表中,这是有选项的。是的,但是当我明天想向同一个文件添加更多条目时。。。也许我太胖了,但我不需要做一些非常原始的字符串操作,比如在文件中向后搜索并切掉结尾]等等?否则,新项目如何进入包含列表?将json解码为python列表,向列表中添加元素并再次编码。对,但这正是我试图避免的。我还没有做过性能测试,但我觉得从一个文件中加载1000项来添加数字1001并写回一个文件要比直接将数字1001写到文件末尾的解决方案慢。这正是我建议您使用JSON所做的。无需进行测试。不同之处在于,正如文档所说:“与pickle和marshal不同,JSON不是一个框架协议,因此尝试通过重复调用dump()来序列化更多对象,同一个fp将导致一个无效的JSON文件。”@benauthor,我记得这句话,但是倒转的。我想它说元帅不像JSON和pickle那样被框起来。我的错。从技术上讲,我认为JSON可以做到这一点,因为它是自定界的,但显然api不支持它。