0

这是一个简单的 Python 脚本,用于在 ScraperWiki 中存储一些数据:

import scraperwiki
scraperwiki.sqlite.save(unique_keys=["a"], data={"a":1, "b":"Foo"})
scraperwiki.sqlite.save(unique_keys=["a"], data={"a":1, "c":"Bar"})

结果是数据存储中的下表:

a  b  c
1     Bar

这很烦人,因为在我的第二个sqlite.save命令中,我没有指定"b":""或任何其他类似的东西来空白第 1 行的“b”列的内容。换句话说,我想要的结果是在数据存储:

a  b    c
1  Foo  Bar

所以我的问题是:当对 ScraperWiki 数据存储使用连续的“保存”操作时,在不覆盖现有数据的情况下附加数据的最佳方法是什么,以实现我上面概述的那种结果?

4

2 回答 2

1

我和你有同样的问题,发现你的答案非常有用。我不得不稍微调整你的代码才能让它工作。具体来说,我将您的第 5 行更改为:

superdictionary['1'].update({"c":"Bar"})

然后产生所需的结果。

于 2013-05-13T11:22:52.560 回答
0

我对这个问题的解决方案是用对 Python 字典字典的连续修改来替换连续的保存操作:数据存储区预期内容的每一行都有一个子字典。使用字典字典而不是字典列表可以更容易地写入相关的子字典,尽管有两个小烦恼:

  • 字典中重复的唯一键;
  • 由于 Scraperwiki 数据存储 (IIUC) 不接受前一种结构但接受后者,因此需要在保存到数据存储之前从字典字典中生成字典列表。

注意。对于大量数据行,在一次操作中将字典列表保存到数据存储区比遍历这些字典并一次将它们保存到数据存储区要快得多。

代码示例:

import scraperwiki
superdictionary = {}
superlist       = []
superdictionary['1'] = {"a":1, "b":"Foo"}
superdictionary['1'].update({"c":"Bar"})
superdictionary['2'] = {"a":2, "b":"Grue", "c":"Gnu"}

for subdictionary in superdictionary:
    superlist.append(superdictionary[subdictionary])
scraperwiki.sqlite.save(["a"], superlist)

应该产生:

a  b     c
1  Foo   Bar
2  Grue  Gnu
于 2013-05-07T19:37:32.717 回答