Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
S
scripts pyDataverse
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
JOUNEAU Thomas
scripts pyDataverse
Commits
d6cdf736
Commit
d6cdf736
authored
3 years ago
by
JOUNEAU Thomas
Browse files
Options
Downloads
Patches
Plain Diff
Upload New File
parent
73864731
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
dorel_export_v_0.1/get_batch_dataset_metadata_with_subcollections.py
+201
-0
201 additions, 0 deletions
...t_v_0.1/get_batch_dataset_metadata_with_subcollections.py
with
201 additions
and
0 deletions
dorel_export_v_0.1/get_batch_dataset_metadata_with_subcollections.py
0 → 100644
+
201
−
0
View file @
d6cdf736
# ===================================================================================
# 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
(
"
\n
Ré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)
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment