Python和JSON(非常长的文件)

时间:2018-02-18 16:26:58

标签: python json pandas cherrypy

我在论坛上搜索过,我看过很多关于它的讨论,但没有什么特别的。 所以我有一个很长的json文件,我想在python中加载它作为字典, not list 。 您可以在此处查看文件https://www.bicing.cat/availability_map/getJsonObject

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

1 个答案:

答案 0 :(得分:1)

使用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文件并将其绘制在地图上,将文件放在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