Я наконец нашел проблему. Ваш код ломается в бизнесе с индексом 21.
if 'RestaurantsPriceRange2' in data2[entry]['attributes']:
Этот оператор проверяет, находится ли "restaurantPriceRange2" в массиве data2 [entry] ['attribute'], но в бизнесе 21 значение ['attribute'] равно None, я думаю, что у бизнеса нет атрибутов.
print data2[21]
{u'city': u'Cleveland', u'neighborhood': u'Central', u'name': u"Rally's Hamburgers", u'business_id': u'gJ5xSt6147gkcZ9Es0WxlA', u'longitude': -81.6663746, u'hours': None, u'state': u'OH', u'postal_code': u'44115', u'categories': u'Fast Food, Burgers, Restaurants', u'stars': 3.0, u'address': u'3040 Carnegie Ave', u'latitude': 41.4999894, u'review_count': 5, u'attributes': None, u'is_open': 1}
Таким образом, вы можете справиться с ошибкой с помощью If, проверяющего, является ли data2 [entry] ['attribute'] чем-то, а не none.
if data2[entry]['attributes'] != None:
Тестирование. Я также обнаружил, что если "Restaurants" в data2 [entry] ["Categories"]: выдает ту же ошибку в некоторых бизнесах, поэтому весь код будет выглядеть так:
import json;
data2 = []
with open('yelp_academic_dataset_business.json') as f:
for line in f:
data2.append(json.loads(line))
len(data2)
business_id = []
city = []
state = []
stars = []
review_count = []
categories = []
postal_code = []
latitude = []
longitude = []
pricerange = []
is_open = []
name = []
for entry in range(0, len(data2)):
if data2[entry]["categories"] != None:
if "Restaurants" in data2[entry]["categories"]:
business_id.append(data2[entry]['business_id'])
name.append(data2[entry]['name'])
city.append(data2[entry]['city'])
state.append(data2[entry]['state'])
stars.append(data2[entry]['stars'])
postal_code.append(data2[entry]['postal_code'])
review_count.append(data2[entry]['review_count'])
categories.append(data2[entry]['categories'])
latitude.append(data2[entry]['latitude'])
longitude.append(data2[entry]['longitude'])
is_open.append(data2[entry]['is_open'])
if data2[entry]['attributes'] != None:
if 'RestaurantsPriceRange2' in data2[entry]['attributes']:
pricerange.append(data2[entry]['attributes']['RestaurantsPriceRange2'])
else:
pricerange.append(0)
data2 = {'business_id ':business_id,'name':name,'city':city,'state':state,'stars':stars,'review_count':review_count,'categories':categories,'latitude':latitude,'longitude':longitude,'is_open':is_open,'pricerange':pricerange,'postal_code':postal_code}
Имейте в виду, что когда вы читаете json, вам нужно знать о пустых значениях или пустых массивах, поэтому вы всегда хотите проверить, существует ли значение, чтобы ваша программа не вылетала.