Saltar al contenido

Python: lee varios archivos json de una carpeta

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 pandasmira 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ó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *