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?
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"}
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))