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