Python和JSON(非常长的文件)

2024-06-17 09:56:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我在论坛上搜索过,我看到很多关于它的讨论,但没有什么是如此具体。 所以我有一个很长的json文件,我想在python中作为dictionary加载它,而不是list。 你可以在这里看到文件https://www.bicing.cat/availability_map/getJsonObject

这是我加载文件的代码,但每次运行时,都收到错误: TypeError:列表索引必须是整数,而不是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]

Tags: 文件httpsimportjsonmapdatadictionaryresponse
1条回答
网友
1楼 · 发布于 2024-06-17 09:56:51

使用pandas库处理类似表的数据:

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))

返回以下内容:

{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文件并将其绘制在地图上,然后将该文件放到地图上地理信息.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)

结果:

enter image description here

相关问题 更多 >