Python 和 JSON(非常长的文件)
Python and JSON(very long file)
我在论坛上搜索过,我看到了很多关于它的讨论,但没有什么特别具体的。
所以我有一个很长的 json 文件,我想将它作为字典加载到 python 中, 而不是列表 。
您可以在此处查看文件 https://www.bicing.cat/availability_map/getJsonObject
这是我加载文件的代码,但每次我 运行 它时,我都会收到错误消息:
类型错误:列表索引必须是整数,而不是 str
import json
import requests
if __name__=='__main__':
response = requests.get("https://www.bicing.cat/availability_map /getJsonObject")
data=response.json()
print data["typeStation"][22]
使用pandas库处理table-like数据:
import pandas as pd
# Read to dataframe
df = pd.read_json("https://www.bicing.cat/availability_map/getJsonObject")
def return_stations(df, n=10, ascending=False):
"""a function allowing to order the bike-stations by available “slots”
and display first N stations. The user can also choose to have the
results in ascending or descending order (by default descending). The
parameters are: -N: number of stations to display. It is optional and
by default N=10. -order: It is optional and the default value is
descending"""
return (df.sort_values(by='slots',ascending=ascending)
.head(n).set_index('id').to_dict('i'))
# Let's print the first 3 in descending order
print(return_stations(df, n=3, ascending=False))
Returns 以下:
{10: {'address': 'Carrer Comerç',
'addressNumber': '27',
'bikes': 0,
'district': 1,
'lat': 41.38498,
'lon': 2.18417,
'name': '10 - C/ COMERÇ, 27',
'nearbyStations': '9,14,115,389',
'slots': 33,
'stationType': 'BIKE',
'status': 'CLS',
'zip': 8003},
213: {'address': 'Sant Fe de Nou Mèxic',
'addressNumber': '2',
'bikes': 0,
'district': 6,
'lat': 41.393783,
'lon': 2.135078,
'name': '213 - C/ SANTA FE DE NOU MÈXIC, 2',
'nearbyStations': '207,208,214,215',
'slots': 33,
'stationType': 'BIKE',
'status': 'OPN',
'zip': 8017},
326: {'address': 'Balmes',
'addressNumber': '409',
'bikes': 0,
'district': 6,
'lat': 41.407384,
'lon': 2.1383,
'name': '326 - C/BALMES, 409',
'nearbyStations': '321,327,328,330',
'slots': 33,
'stationType': 'BIKE',
'status': 'OPN',
'zip': 8022}}
哦,还有一件事……看到你在那里得到了经纬度:
我们可以编写一个 geojson 文件并将其绘制在地图上,将文件拖放到 geojson.io 上。这是一个函数:
def return_geojson(df, latlng):
d = dict(type="FeatureCollection",features=[])
for ind,row in df.fillna('').iterrows():
p = row.drop(latlng).to_dict()
g = dict(type="Point",coordinates=list(row[latlng])[::-1])
f = dict(type="Feature", properties=p, geometry=g)
d['features'].append(f)
return d
with open('map.geojson','w') as f:
d = return_geojson(df,['lat','lon'])
json.dump(d,f)
结果:
我在论坛上搜索过,我看到了很多关于它的讨论,但没有什么特别具体的。 所以我有一个很长的 json 文件,我想将它作为字典加载到 python 中, 而不是列表 。 您可以在此处查看文件 https://www.bicing.cat/availability_map/getJsonObject
这是我加载文件的代码,但每次我 运行 它时,我都会收到错误消息: 类型错误:列表索引必须是整数,而不是 str
import json
import requests
if __name__=='__main__':
response = requests.get("https://www.bicing.cat/availability_map /getJsonObject")
data=response.json()
print data["typeStation"][22]
使用pandas库处理table-like数据:
import pandas as pd
# Read to dataframe
df = pd.read_json("https://www.bicing.cat/availability_map/getJsonObject")
def return_stations(df, n=10, ascending=False):
"""a function allowing to order the bike-stations by available “slots”
and display first N stations. The user can also choose to have the
results in ascending or descending order (by default descending). The
parameters are: -N: number of stations to display. It is optional and
by default N=10. -order: It is optional and the default value is
descending"""
return (df.sort_values(by='slots',ascending=ascending)
.head(n).set_index('id').to_dict('i'))
# Let's print the first 3 in descending order
print(return_stations(df, n=3, ascending=False))
Returns 以下:
{10: {'address': 'Carrer Comerç',
'addressNumber': '27',
'bikes': 0,
'district': 1,
'lat': 41.38498,
'lon': 2.18417,
'name': '10 - C/ COMERÇ, 27',
'nearbyStations': '9,14,115,389',
'slots': 33,
'stationType': 'BIKE',
'status': 'CLS',
'zip': 8003},
213: {'address': 'Sant Fe de Nou Mèxic',
'addressNumber': '2',
'bikes': 0,
'district': 6,
'lat': 41.393783,
'lon': 2.135078,
'name': '213 - C/ SANTA FE DE NOU MÈXIC, 2',
'nearbyStations': '207,208,214,215',
'slots': 33,
'stationType': 'BIKE',
'status': 'OPN',
'zip': 8017},
326: {'address': 'Balmes',
'addressNumber': '409',
'bikes': 0,
'district': 6,
'lat': 41.407384,
'lon': 2.1383,
'name': '326 - C/BALMES, 409',
'nearbyStations': '321,327,328,330',
'slots': 33,
'stationType': 'BIKE',
'status': 'OPN',
'zip': 8022}}
哦,还有一件事……看到你在那里得到了经纬度: 我们可以编写一个 geojson 文件并将其绘制在地图上,将文件拖放到 geojson.io 上。这是一个函数:
def return_geojson(df, latlng):
d = dict(type="FeatureCollection",features=[])
for ind,row in df.fillna('').iterrows():
p = row.drop(latlng).to_dict()
g = dict(type="Point",coordinates=list(row[latlng])[::-1])
f = dict(type="Feature", properties=p, geometry=g)
d['features'].append(f)
return d
with open('map.geojson','w') as f:
d = return_geojson(df,['lat','lon'])
json.dump(d,f)
结果: