Skip to content
Snippets Groups Projects
Commit d6cdf736 authored by JOUNEAU Thomas's avatar JOUNEAU Thomas
Browse files

Upload New File

parent 73864731
No related branches found
No related tags found
No related merge requests found
# ===================================================================================
# Export des métadonnées de l'ensemble des jeux de données d'une collection Dataverse
# (incluant les sous-collections jusqu'à 4 niveaux)
# ===================================================================================
print ("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n")
print ("# ===========================================================================#")
print ("# Export des métadonnées de l'ensemble des jeux de #")
print ("# données d'une collection Dataverse #")
print ("# (incluant les sous-collections jusqu'à 4 niveaux) #")
print ("# ===========================================================================#")
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# !!!!!!!!! TODO !!!!!!!!!!!!!!!!!
# - Version parallèle à réaliser acceptant les paramètres d'entrepôt et de collection comme arguments d'une commande en ligne.
# -----------------------
# Imports et déclarations
# -----------------------
import json
import os
from pyDataverse.api import NativeApi, DataAccessApi
from pyDataverse.models import Dataverse
# ----------------------------------------------------
# Déclaration de l'entrepôt Dataverse (URL et clé API)
# ----------------------------------------------------
repositories = {
"1. Entrepôt CODR" : "https://tested-dataverse5.univ-lorraine.fr" ,
"2. Entrepôt bac à sable" : "https://bac-dataverse.univ-lorraine.fr" ,
"3. DOREL / production" : "https://dorel.univ-lorraine.fr",
"4. Démo Dataverse" : "https://demo.dataverse.org"
}
print ("Depuis quel entrepôt voulez-vous effectuer cet export ? ")
for repository_name, repository_URL in repositories.items():
print (f"\t{repository_name} : {repository_URL})")
choice_repository = 0
while choice_repository not in ("1", "2", "3", "4"):
choice_repository = input ("Effectuez votre choix : ")
for repository_name, repository_URL in repositories.items():
if choice_repository == repository_name [0]:
base_url = repository_URL
break
print (f"Adresse de l'entrepôt : {base_url}")
api_key = input ("Entrez ici votre clé API (facultatif pour l'export de métadonnées) : ")
api = NativeApi(base_url,api_key)
data_api = DataAccessApi(base_url,api_key)
# Test de renvoi de version et de code http
print("Test de renvoi de version et de code http...")
resp = api.get_info_version()
print (resp.json())
print (resp.status_code)
print (resp)
# Entrée de la collection à exporter
dataverse_root = input ("Entrez ici le nom de la collection dataverse à exporter (défaut : univ-lorraine) : ")
if dataverse_root != "":
dataverse_root = dataverse_root
elif dataverse_root == "":
dataverse_root = "univ-lorraine"
# ---------------------------------------------------------------
# Création d'une liste des identifiants de collections dataverses
# ---------------------------------------------------------------
# détermination de la liste des collections et sous-collections
# la hiérarchie des listes de collections est : dataverse_list > dataverse_children_level_2 > dataverse_children_level_3 > ...
# la hiérarchie des noms de collections est : dataverse entry > dataverse_child_level_2 > dataverse_child_level_3 > ...
# TODO : revoir ça plus élégamment avec des fonctions...
print ("\nÉnumération des sous-collections...")
dataverse_list = api.get_children(dataverse_root, children_types = ["dataverses"])
dataverse_list = json.dumps(dataverse_list) # dump de la sortie json générée précédemment
dataverse_list = json.loads(dataverse_list) # Conversion en dictionnaire de la liste des datasets
dataverse_id_list = []
dataverse_alias_list = []
for dataverse_entry in dataverse_list : # on prend chaque entrée (dictionnaire) de la liste
dataverse_alias = dataverse_entry["dataverse_alias"] # on récupère l'alias du dataverse (ex. "lmops")
dataverse_id = dataverse_entry["dataverse_id"] # on récupère l'identifiant du dataverse (ex. "9231")
print (f"{dataverse_alias} : {dataverse_id}")
dataverse_alias_list.append(dataverse_alias) # on ajoute l'alias à la liste
dataverse_id_list.append(dataverse_id) # on ajoute l'id à la liste
dataverse_children_level_2 = dataverse_entry["children"] # Le contenu des "children" des est stocké dans une liste
if dataverse_children_level_2 != "":
# Traitement des sous-dataverses de niveau 2 (children_level_2)
for dataverse_child_level_2 in dataverse_children_level_2:
dataverse_alias = dataverse_child_level_2["dataverse_alias"] # on récupère l'alias du dataverse enfant (ex. "sous-plateforme_spectro")
dataverse_id = dataverse_child_level_2["dataverse_id"] # on récupère l'identifiant du dataverse (ex. "12345")
print (f"{dataverse_alias} : {dataverse_id} (est un enfant de : {dataverse_entry['dataverse_alias']}\n")
dataverse_alias_list.append(dataverse_alias) # on ajoute l'alias à la liste
dataverse_id_list.append(dataverse_id) # on ajoute l'id à la liste
dataverse_children_level_3 = dataverse_child_level_2["children"] # Le contenu des "children" est stocké dans une liste
if dataverse_children_level_3 != "":
# Traitement des sous-dataverses de niveau 3 (children_level_3)
for dataverse_child_level_3 in dataverse_children_level_3:
dataverse_alias = dataverse_child_level_3["dataverse_alias"] # on récupère l'alias du dataverse enfant (ex. "sous-sous-plateforme_spectro")
dataverse_id = dataverse_child_level_3["dataverse_id"] # on récupère l'identifiant du dataverse (ex. "12345")
print (f"{dataverse_alias} : {dataverse_id} (est un enfant de : {dataverse_child_level_2['dataverse_alias']}\n")
dataverse_alias_list.append(dataverse_alias) # on ajoute l'alias à la liste
dataverse_id_list.append(dataverse_id) # on ajoute l'id à la liste
dataverse_children_level_4 = dataverse_child_level_3["children"] # Le contenu des "children" des est stocké dans une liste
if dataverse_children_level_4 != "" :
# Traitement des sous-dataverses de niveau 4 (children_level_3)
for dataverse_child_level_4 in dataverse_children_level_4:
dataverse_alias = dataverse_child_level_4["dataverse_alias"] # on récupère l'alias du dataverse enfant (ex. "sous-sous-sous-plateforme_spectro")
dataverse_id = dataverse_child_level_4["dataverse_id"] # on récupère l'identifiant du dataverse (ex. "12345")
print (f"{dataverse_alias} : {dataverse_id} (est un enfant de : {dataverse_child_level_3['dataverse_alias']}\n")
dataverse_alias_list.append(dataverse_alias) # on ajoute l'alias à la liste
dataverse_id_list.append(dataverse_id) # on ajoute l'id à la liste
print (dataverse_alias_list)
# formattage et sortie JSON de la liste des sous-collections dataverses sous la collection à exporter
# formatted_dataverse_list = json.dumps(dataverse_list, sort_keys=False, indent=8)
# formatted_dataverse_list_output_file = input ("Entrez un nom de fichier pour la sortie JSON de la liste des dataverses : \n")
# with open (formatted_dataverse_list_output_file, 'w') as formatted_dataverse_list_output_file_object:
# formatted_dataverse_list_output_file_object.write(formatted_dataverse_list)
# ----------------------------
# Création d'une liste des DOI
# ----------------------------
print ("\nRécupération des DOI...")
pid_list=[]
for dataverse_alias_for_export in dataverse_alias_list:
dataset_list = api.get_children(dataverse_alias_for_export, children_types = ["datasets"])
print (dataset_list)
dataset_list = json.dumps(dataset_list) # dump de la sortie json générée précédemment
dataset_list = json.loads(dataset_list) # Conversion en dictionnaire de la liste des datasets
for dataset_entry in dataset_list: # on prend chaque entrée (dictionnaire) de la liste
dataset_pid = dataset_entry["pid"] # on récupère le pid dans le dictionnaire dataset_entry
print (dataset_pid)
dataset_pid_truncated = dataset_pid[4:] # suppression des quatres premiers caractères (doi:) de la chaîne
# print (dataset_pid)
pid_list.append(dataset_pid_truncated) # on ajoute ce résultat à la liste pid_list
# print (pid_list)
print ("Liste des DOI :")
for pid in pid_list:
print (pid)
print (f" {len(pid_list)} jeu(x) de données trouvé(s). ")
print (pid_list)
# --------------------------------------------------------------------------------------------
# Génération des sorties JSON de chaque dataset et écriture optionnelle d'un fichier de sortie
# --------------------------------------------------------------------------------------------
# file_wished_input = input("Souhaitez-vous exporter au format JSON o/n ? (défaut n) ") # Décommenter cette ligne pour rendre l'écriture optionnelle.
file_wished_input = "o" # Commenter cette ligne pour rendre l'écriture optionnelle.
if file_wished_input == "o":
file_wished = True
print("Un fichier va être créé.")
complete_list_file_name_input = input("Choisissez un nom de fichier pour la sortie, sans l'extension. Défaut [export_json]: ")
if complete_list_file_name_input == "":
complete_list_file_name = "export_json.json"
else :
complete_list_file_name = f"{complete_list_file_name_input}.json"
with open (complete_list_file_name, 'a') as complete_list_file_object:
complete_list_file_object.write("{") # ajout d'une accolade ouvrante au début du fichier
elif file_wished_input == "":
file_wished = False
print("Pas de fichier.")
complete_list = []
counter = len(pid_list)
for pid in pid_list:
counter = counter - 1
dataset_json = api.get_dataset(identifier = f"doi:{pid}").json()["data"] # export de la référence correspondant à 'pid'
del (dataset_json["latestVersion"]["files"]) # suppression des métadonnées de fichiers
complete_list.append(dataset_json) # ajout de la sortie json à une liste
# Ecriture du fichier si l'utilisateur le souhaite
if file_wished == True:
print("Écriture du fichier JSON en cours...")
formatted_dataset_json = json.dumps(dataset_json, sort_keys=False, indent=4)
formatted_dataset_json_string = str (formatted_dataset_json) # Conversion en chaîne de caractères
# formatted_dataset_json_string = f'"doi" : "{pid}" , "citation" : [{formatted_dataset_json_string}] ,'
if counter > 0 : # Si c'est la dernière référence on ne met pas de virgule pour que le fichier JSON soit valide.
formatted_dataset_json_string = f'"{pid}" : [{formatted_dataset_json_string}] ,'
elif counter == 0 :
formatted_dataset_json_string = f'"{pid}" : [{formatted_dataset_json_string}] '
with open (complete_list_file_name, 'a') as complete_list_file_object:
complete_list_file_object.write(formatted_dataset_json_string) # ecriture de la référence formattée dans le fichier de sortie
complete_list_file_object.write("\n")
if file_wished == True :
with open (complete_list_file_name, 'a') as complete_list_file_object: # correction en mode bourrin du fichier de sortie
complete_list_file_object.write("}") # ajout d'une accolade fermante à la fin du fichier
# # Optionnellement, affichage de la liste complète finale (pour débogage)
# print_complete_list = input ("Voulez-vous voir la liste complète o/n ? (défaut n) ")
# if print_complete_list == "o":
# print (complete_list)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment