web-dev-qa-db-fra.com

Python: lit plusieurs fichiers json depuis un dossier

Je voudrais savoir comment lire plusieurs fichiers json à partir d'un seul dossier (sans spécifier les noms de fichiers, mais ce sont des fichiers json). 

En outre, il est possible de les transformer en un pandas DataFrame?

Pouvez-vous me donner un exemple de base?

16
donpresente

Une option est de lister tous les fichiers d'un répertoire avec os.listdir et de ne rechercher que ceux qui se terminent par '.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']

Vous pouvez maintenant utiliser pandas DataFrame.from_dict pour lire le json (un dictionnaire python à ce stade) sur un fichier de données pandas:

montreal_json = pd.DataFrame.from_dict(many_jsons[0])
print montreal_json['features'][0]['geometry']

Impressions:

{u'type': u'Point', u'coordinates': [-73.6051013, 45.5115944]}

Dans ce cas, j'avais ajouté quelques jsons à une liste many_jsons. Le premier json de ma liste est en fait un geojson avec quelques données géographiques sur Montréal. Je connais déjà le contenu, alors j’imprime la «géométrie» qui me donne le solitaire de Montréal.

Le code suivant résume tout ce qui précède:

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)

pour moi cela imprime:

  country           city                   long/lat
0  Canada  Montreal city  [-73.6051013, 45.5115944]
1  Canada        Toronto  [-79.3849008, 43.6529206]

Il peut être utile de savoir que pour ce code, j'avais deux geojsons dans un répertoire nommé "json". Chaque JSON avait la structure suivante:

{"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"}
23
Scott

Itérer un répertoire (plat) est facile avec le glob module

from glob import glob

for f_name in glob('foo/*.json'):
    ...

Pour lire JSON directement dans pandas, voir ici .

6
Ami Tavory

Pour lire les fichiers JSON, 

import os
import glob

contents = []
json_dir_name = "/path/to/json/dir"

json_pattern = os.path.join(json_dir_name,'*.json'
file_list = glob.glob(json_pattern)
for file in file_list:
  contents.append(read(file))
1
Saravana Kumar