Un article précédent a montré comment générer facilement un corpus textuel avec Python. Le corpus ainsi produit se présentait sous forme d’un fichier au format XML, écrit notamment grâce à xml.etree.ElementTree
, qui fait partie de la librairie standard.
ElementTree
s’avère donc utile pour créer des fichiers XML, mais permet aussi de lire des fichiers préexistants, notamment dans le but de les modifier.
Voici comment procéder pour lire l’arborescence d’un fichier XML et lui apporter des modifications.
Vous pouvez retrouver le code présenté ici sous forme de snippet Gitlab. Le fichier utilisé est le fichier de sortie du script présenté dans cet article. Il est mis à disposition sur Gitlab et sur Github.
Dans l’article consacré à la constitution automatique d’un corpus web en XML, l’une des améliorations suggérées était de mettre en place un identifiant plus explicite qu’un simple identifiant chiffré. Je vais maintenant expliquer comment mettre ce changement en place sur un corpus déjà constitué, enregistré dans un fichier XML.
Le corpus pris en exemple est décrit ici, ce qui est à modifier est donc l’attribut id
de chaque élément Page
. Les étapes de traitement sont les suivantes :
- Parser l’arborescence XML du fichier d’entrée.
- Parcourir chaque élément
Page
pour en modifier l’attributid
. - Enregistrer la nouvelle arborescence dans un fichier.
Le parsing se fait de façon très simple puisqu’une fonction dédiée, parse()
, est prévue dans ElementTree
1. Elle prend en argument le contenu du fichier, ouvert via with open()
.
with open("web_corpus.xml", encoding="utf-8") as corpus:
tree = ET.parse(corpus)
La variable tree
correspond maintenant à l’arborescence XML parsée par ElementTree
2, mais l’objet correspondant n’est pas itérable. Pour pouvoir mettre en place une boucle et naviguer dans l’arborescence, il faut d’abord récupérer sa racine avec .getroot()
.
Rechercher un ou plusieurs éléments de l’arborescence se fait respectivement avec .find()
(renvoie le premier élément correspondant) et .findall()
(renvoie tous les éléments correspondants). La racine ayant été associée à la variable root
, pour parcourir les éléments Page
du corpus il faudra utiliser une boucle for
sur root.findall("Page")
3.
Voici à quoi ressemble le script pour le moment :
with open("web_corpus.xml", encoding="utf-8") as corpus:
tree = ET.parse(corpus)
root = tree.getroot()
for page in root.findall("Page"):
# modifier l'attribut 'id'
La valeur du ou des attributs associés à l’élément Page
courant (désigné par la variable page
) s’obtient avec page.attrib
. Si on remplace la ligne commentée du script ci-dessus par print(page.attrib)
, la console affichera ceci :
{'id': '1'} {'id': '2'} {'id': '3'} {'id': '4'}
Le fichier XML du corpus comporte effectivement 4 éléments Page
portant les attributs 1 à 4. On peut ici voir que la valeur des attributs d’un élément est récupérée sous forme de dictionnaire. Elle va alors pouvoir être lue et modifiée en tant que telle. Dans le cas présent, pour modifier l’attribut id
de la page
courante, il faut attribuer une nouvelle valeur à page.attrib['id']
.
with open("web_corpus.xml", encoding="utf-8") as corpus:
tree = ET.parse(corpus)
root = tree.getroot()
for page in root.findall("Page"):
current_id = page.attrib['id']
new_id = f"wikipedia_yosakoi-{current_id}"
page.attrib['id'] = new_id
L’arborescence XML contenue dans la variable root
correspondant à sa racine a été mise à jour. Il ne faut toutefois pas en rester là, parce qu’en l’état ces modifications n’ont été répercutées dans aucun fichier de sortie. L’écriture du fichier de sortie, qu’il s’agisse d’un nouveau document XML ou de l’écrasement du fichier d’entrée, se fait comme expliqué précédemment4.
Voici les premières lignes du nouveau fichier XML, avec changement de valeur pour id
:
En reprenant les principes de ce traitement (script complet disponible ici), il est ainsi possible de modifier la valeur d’à peu près n’importe quel constituant de la structure XML : les attributs avec .attrib
comme montré ici, mais aussi le contenu textuel avec .text
ou encore les balises avec .tag
, par exemple.
- Voir la documentation. [↩]
- Soit une instance d’objet de la classe
xml.etree.ElementTree.ElementTree
. [↩] - Attention à la casse pour le nom des éléments, elle doit être respectée pour que
.findall()
fonctionne. [↩] - Voir également cet article pour plus de détails concernant la déclaration XML. [↩]
OpenEdition vous propose de citer ce billet de la manière suivante :
Alexander Delaporte (20 juillet 2021). Lire (et modifier) un fichier XML avec Python. Tekipaki. Consulté le 11 décembre 2024 à l’adresse https://doi.org/10.58079/up2m