将数据附加到ScraperWiki数据存储区

时间:2013-05-07 17:12:37

标签: python scraperwiki

这是一个简单的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数据存储使用连续的“保存”操作时,为了实现上面列出的结果,在不覆盖现有数据的情况下附加数据的最佳方法是什么?< /强>

2 个答案:

答案 0 :(得分:1)

我遇到了和你一样的问题,发现你的答案非常有用。我不得不稍微调整你的代码,以使其工作。具体来说,我将第5行更改为:

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

然后产生所需的结果。

答案 1 :(得分:0)

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

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

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

代码示例:

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