Python迭代';非类型';使用';在';陈述
您好,我使用以下代码将JSON文件加载到列表中:Python迭代';非类型';使用';在';陈述,python,json,dataset,iteration,nonetype,Python,Json,Dataset,Iteration,Nonetype,您好,我使用以下代码将JSON文件加载到列表中: import json postal_mtl = ['H9W','H4W','H9P','H3B','H3A','H2Z','H3H','H3G','H3X','H9J','H1B','H1G','H1H','H4X','H2Y','H9R','H3Z','H3Y'] data = [] with open('business.json',encoding="utf8") as f: for line in f:
import json
postal_mtl = ['H9W','H4W','H9P','H3B','H3A','H2Z','H3H','H3G','H3X','H9J','H1B','H1G','H1H','H4X','H2Y','H9R','H3Z','H3Y']
data = []
with open('business.json',encoding="utf8") as f:
for line in f:
data.append(json.loads(line))
compteur3 = 0
for i in range(len(data)):
if data[i]['postal_code'][0:3] in postal_mtl and 'Restaurants' in data[i]['categories']:
compteur3 += 1
print(compteur3)
现在,我试图在这个数据集中找到蒙特利尔的餐馆数量(来自Yelp)。我尝试了以下代码:
import json
postal_mtl = ['H9W','H4W','H9P','H3B','H3A','H2Z','H3H','H3G','H3X','H9J','H1B','H1G','H1H','H4X','H2Y','H9R','H3Z','H3Y']
data = []
with open('business.json',encoding="utf8") as f:
for line in f:
data.append(json.loads(line))
compteur3 = 0
for i in range(len(data)):
if data[i]['postal_code'][0:3] in postal_mtl and 'Restaurants' in data[i]['categories']:
compteur3 += 1
print(compteur3)
但是我得到一个错误,说“类型为'NoneType'的参数不可iterable”,我猜Python认为日期[I]['categories']是一个非类型?为什么呢?如果我输入以下内容,我可以看到它显然是一个字符串:
data[5]['categories']
'Shipping Centers, Couriers & Delivery Services, Local Services, Printing Services'
现在我只想迭代我的数据列表中的所有元素,并找到每一行我们有“餐馆”这个词的地方(我把蒙特利尔的东西修好了)。。。有什么想法吗?谢谢 根据提供的代码,错误似乎最有可能来自if条件。具体来说,它很可能来自数据[i]['categories']中的语句
'Restaurants'。在幕后,Python试图遍历数据[i]['categories']
,以查看其中是否有“餐厅”。如果data[i]['categories']
为None
,则会导致此错误
这可能是由于JSON字符串未按预期的方式格式化所致。也许,如果“类别”字段中未列出任何类别,则会放置一个null
,而不是一个空列表。要在代码中检查这一点,可以尝试以下操作:
compteur3 = 0
for i in range(len(data)):
is_inmontreal = data[i]['postal_code'][0:3] in postal_mtl
is_restaurant = data[i]['categories'] and 'Restaurants' in data[i]['categories']
if is_inmontreal and is_restaurant:
compteur3 += 1
print(compteur3)
在上面,我简单地将条件分为两部分。从功能上讲,这与将条件放在一行中是一样的,只是使它稍微清晰一些。但是,我还添加了一个签入is_restaurant
,以查看数据[I]['categories']
是否具有正真值。实际上,这将检查该值是否不是None
,并且不是空列表。如果你真的想表达清楚,你也可以这样做
is_restaurant = data[i]['categories'] is not None and 'Restaurants' in data[i]['categories']
根据数据的脏程度,您可能需要进一步使用异常处理。然而,以上只是猜测,因为我不知道数据是什么样子。顺便说一下,在数据中,所有元素都是这种格式:{'business_id':'1sweh84yjxfytovillxoaq','name':'Arizona Biltmore Golf Club','address':'2818 E Camino Acequia Drive','city':'Phoenix','state':'AZ','postal_code':'85016','latitude':33.5221425,'longitude':-112.0184807,'stars':3.0,'review(count':5,'是开放的:'0','attributes':{'GoodForKids',“类别”:“高尔夫,积极生活”,“小时数”:无}
基本上是这样一个字典列表,我确信我使用的键是正确的。您可能有条目缺少邮政编码
或类别
。您可以对数据中的条目迭代,然后检查条目上是否存在邮政编码和类别,然后再进行comparison.@ABASSSESSAY邮政编码或类别似乎没有任何问题,我可以对类别运行以下操作,并且不会得到任何错误:counter=0,用于范围内的I(len(data)):如果数据[I]['categories']=='Restaurants':counter+=1打印(compteur)
它将返回0,对于邮政编码,它也已经起作用了。问题是“类别”中的每个元素都有多个字符,我只想要“餐厅”