Este dilema se puede resolver de diversas maneras, pero en este caso te mostramos la que para nosotros es la resolución más completa.
Solución:
Una opción es enumerar todos los archivos en un directorio con os.listdir y luego encontrar solo aquellos que terminan en ‘.json’:
import os, json
import pandas as pd
path_to_json = 'somedir/'
json_files = [pos_json for pos_json in os.listdir(path_to_json) if pos_json.endswith('.json')]
print(json_files) # for me this prints ['foo.json']
Ahora puede usar pandas DataFrame.from_dict para leer en el json (un diccionario de python en este punto) en un marco de datos de pandas:
montreal_json = pd.DataFrame.from_dict(many_jsons[0])
print montreal_json['features'][0]['geometry']
Huellas dactilares:
u'type': u'Point', u'coordinates': [-73.6051013, 45.5115944]
En este caso, agregué algunos jsons a una lista. many_jsons
. El primer json de mi lista es en realidad un geojson con algunos datos geográficos de Montreal. Ya estoy familiarizado con el contenido, así que imprimo la ‘geometría’ que me da el lon/lat de Montreal.
El siguiente código resume todo lo anterior:
import os, json
import pandas as pd
# this finds our json files
path_to_json = 'json/'
json_files = [pos_json for pos_json in os.listdir(path_to_json) if pos_json.endswith('.json')]
# here I define my pandas Dataframe with the columns I want to get from the json
jsons_data = pd.DataFrame(columns=['country', 'city', 'long/lat'])
# we need both the json and an index number so use enumerate()
for index, js in enumerate(json_files):
with open(os.path.join(path_to_json, js)) as json_file:
json_text = json.load(json_file)
# here you need to know the layout of your json and each json has to have
# the same structure (obviously not the structure I have here)
country = json_text['features'][0]['properties']['country']
city = json_text['features'][0]['properties']['name']
lonlat = json_text['features'][0]['geometry']['coordinates']
# here I push a list of data into a pandas DataFrame at row given by 'index'
jsons_data.loc[index] = [country, city, lonlat]
# now that we have the pertinent json data in our DataFrame let's look at it
print(jsons_data)
para mí esto imprime:
country city long/lat
0 Canada Montreal city [-73.6051013, 45.5115944]
1 Canada Toronto [-79.3849008, 43.6529206]
Puede ser útil saber que para este código tenía dos geojsons en un directorio llamado ‘json’. Cada json tenía la siguiente estructura:
"features":
["properties":
"osm_key":"boundary","extent":
[-73.9729016,45.7047897,-73.4734865,45.4100756],
"name":"Montreal city","state":"Quebec","osm_id":1634158,
"osm_type":"R","osm_value":"administrative","country":"Canada",
"type":"Feature","geometry":
"type":"Point","coordinates":
[-73.6051013,45.5115944]],
"type":"FeatureCollection"
Iterar un directorio (plano) es fácil con el glob
módulo
from glob import glob
for f_name in glob('foo/*.json'):
...
En cuanto a leer JSON directamente en pandas
mira aquí.
Carga todos los archivos que terminan con * .json desde un directorio específico en un dictado:
import os,json
path_to_json = '/lala/'
for file_name in [file for file in os.listdir(path_to_json) if file.endswith('.json')]:
with open(path_to_json + file_name) as json_file:
data = json.load(json_file)
print(data)
Pruébelo usted mismo: https://repl.it/@SmaMa/loadjsonfilesfromfolderintodict
Sección de Reseñas y Valoraciones
Tienes la posibilidad comunicar esta crónica si te ayudó.