2013-05-07 71 views
0

下面是一个简单的Python脚本存储在ScraperWiki一些数据:数据附加到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数据存储,什么是不覆盖现有数据追加数据的最佳方式,以达到某种结果我已经在上面列出了?

回答

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 
1

我有同样的问题,因为你发现你的答案是非常有用的。为了让它工作,我不得不微调你的代码。具体来说,我把你的第五行改为:

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

然后产生所需的结果。

+0

感谢您捕捉该错误;我相应地更新了我的答案。 – sampablokuper 2013-05-14 02:47:30