2016-08-03 25 views
1

我通过检索json格式的数据在python中创建了一本字典。无法在字典中使用python脚本输入字符

[{"id":"1","kingdom":"Metazoa ","phylum":"Arthropoda ","class":"Insecta ","order":"Hemiptera ","family":"Belostomatidae ","genus":"Abedus"},<br> 
{"id":"2","kingdom":"Viridiplantae ","phylum":"Streptophyta ","class":"unclassified_Streptophyta ","order":"Pinales ","family":"Pinaceae ","genus":"Abies"}] 

当我访问这些数据,我想只拿这样的,其中的genus值为Abies,而是我得到的错误

ValueError : invalid literal for int () with base 10 : 'Abies'

但是,如果我输入一个数值,我得到的数据对应于json的“id”。

这是我的脚本:

import urllib2 
import simplejson 

title = raw_input("find taxonom: ") 
print "key: ",title 

response = urllib2.urlopen("http://localhost/csv/taxo.json") 
data = simplejson.load(response) 
get = int(str(title)) 
print data[get] 

我如何得到它显示的数据“ID”,“王国”,每一个为属匹配输入数据的“phlyum”,“阶级”,等等?

+0

'int(str(title))'不能正确:它表示“获取标题,使其成为一个字符串,并使该字符串的整数”。我认为标题不是整数。 – 9000

回答

3

你得到的错误是因为你试图将包含非数值的字符串转换为整数。要解决此问题,请删除get = int(str(title))


您拥有的数据是一个列表。列表使用数字索引来访问列表中不同位置的元素。要打印genus值,你要做的:

print data[1]['genus'] 

注意,这个目标在列表中的第二个字典。要打印的genus值第一个字典,你必须改变10


要打印其中包含genus匹配标题值每个字典的值,这样做:

for attr_map in data: 
    if attr_map['genus'] == title: 
     print attr_map 

程序的运行示例:

>>> import json 
>>> buffer = '[{"id":"1","kingdom":"Metazoa ","phylum":"Arthropoda ","class":"Insecta ","order":"Hemiptera ","family":"Belostomatidae ","genus":"Abedus"},{"id":"2","kingdom":"Viridiplantae ","phylum":"Streptophyta ","class":"unclassified_Streptophyta ","order":"Pinales ","family":"Pinaceae ","genus":"Abies"}]' 
>>> data = json.loads(buffer) 
>>> data 
[{u'kingdom': u'Metazoa ', u'family': u'Belostomatidae ', u'class': u'Insecta ', u'id': u'1', u'phylum': u'Arthropoda ', u'genus': u'Abedus', u'order': u'Hemiptera '}, {u'kingdom': u'Viridiplantae ', u'family': u'Pinaceae ', u'class': u'unclassified_Streptophyta ', u'id': u'2', u'phylum': u'Streptophyta ', u'genus': u'Abies', u'order': u'Pinales '}] 
>>> 
>>> title = raw_input("find taxonom: ") 
find taxonom: Abies 
>>> for attr_map in data: 
...  if attr_map['genus'] == title: 
...   print attr_map 
... 
{u'kingdom': u'Viridiplantae ', u'family': u'Pinaceae ', u'class': u'unclassified_Streptophyta ', u'id': u'2', u'phylum': u'Streptophyta ', u'genus': u'Abies', u'order': u'Pinales '} 
+1

可能,不是OP想要的。他希望通过'genus'键进行搜索。 – SuperSaiyan

+1

谢谢@SuperSaiyan,是的,我想找到关键词属。 –

+0

谢谢@ smac89,如果我删除'get = int(str(title))'有一个错误'TypeError:列表索引必须是整数,而不是str' –

2

这将找到相匹配的第一个条目:

print next(x for x in data if x["genus"] == title) 
+0

如果你打算使用'next'而不是'[<列表理解>] [0]',为什么不只是'下一个()'? – jedwards

+1

当我写下'next'时,忘记取下它们。现在修复它。感谢您指出! – SuperSaiyan

+0

@SuperSaiyan不能工作错误'StopIteration' –