刮取数据附加到数据

2024-06-15 17:39:29 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是一个简单的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"})

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

^{pr2}$

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

a  b    c
1  Foo  Bar

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


Tags: 数据import命令脚本sqlitedatafoosave
2条回答

我对这个问题的解决方案是用对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)

应产生:

^{pr2}$

我和你有同样的问题,我发现你的答案很有用。我不得不稍微修改一下你的代码才能让它正常工作。具体来说,我把你的第五行改成:

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

然后产生期望的结果。在

相关问题 更多 >