TD : CSV > Markdown (1)
Pour rappel nous avons vu en TD comment aborder la manipulation d'une chaîne de caractères multi-lignes contenant des données au format CSV. L'exemple fourni correspond au code ci-dessous :
csvData = '''
activité, durée, importance
devoirs,4h,très important
Valorant,4h, important
Lecture,4h, important
Jardinage,2h,important
'''
L'objectif énoncé est d'obtenir, à partir du code ci-dessus, l'équivalent sous la forme d'un tableau Markdown tel que pourrait le générer le site Table Convert :
| activité | durée | importance |
|-----------|-------|----------------|
| devoirs | 4h | très important |
| Valorant | 4h | important |
| Lecture | 4h | important |
| Jardinage | 2h | important |
Première partie : split()
Notre objectif, pour reconstruire le tableau Markdown, est d'extraire les informations utiles telles que activité
, durée
, importance
, Jardinage
, 2h
, etc. sans considérer les éléments de structure du CSV, qui sont la virgule ,
et le retour à la ligne \n
.
Premier split : les retours à la ligne
La chaîne de caractères csvData
est une chaîne multilignes ce qui signifie qu'elle contient plusieurs retours à la ligne. Nous allons donc commencer par séparer ces lignes pour pouvoir les traiter indépendamment les unes des autres.
La fonction split()
permet cela : lignes = csvData.split('\n')
Nous obtenons alors, au lieu d'une seule variable multilignes, une liste dont chaque élément correspond à une ligne :
# csvData est une unique chaîne de caractères multilignes
csvData = '''
activité, durée, importance
devoirs,4h,très important
Valorant,4h, important
Lecture,4h, important
Jardinage,2h,important
'''
lignes = csvData.split('\n')
# Pour créer la variables lignes, on a découpé csvData pour obtenir une liste
# La liste contient 7 éléments, un pour chaque ligne de csvData
# contenu de la variable lignes :
[
'',
'activité, durée, importance',
'devoirs,4h,très important',
'Valorant,4h, important',
'Lecture,4h, important',
'Jardinage,2h,important',
''
]
Second split : les virgules
Pour comprendre notre objectif, nous allons pour l'instant traiter une seule ligne. Par exemple, considérons la chaîne de caractères 'activité, durée, importance'
Cette chaîne de caractères contient trois mots séparés par une virgule puis un espace. Nous voulons conserver les mots, et ignorer la combinaison ,
(virgule puis espace).
La solution : utiliser de nouveau la fonction split()
, en lui donnant cette fois-ci comme séparateur "virgule puis espace" : ligne.split(', ')
.
Ainsi, la chaîne de caractères sera divisée en trois parties, et nous obtiendrons la liste ['activité', 'durée', 'importance']
qui est une liste de trois items.
ligne = 'activité, durée, importance'
items = ligne.split(', ')
# Nous avons donc cette fois-ci découpé une ligne et obtenu une liste
# Cette liste, appelée ici items, contient bien nos mots
# contenu de la variable items :
[
'activité',
'durée',
'importance'
]
Pour résumer
Automatiser avec for
En utilisant le mot-clé for
pour créer une boucle, nous avons pu automatiser le processus. Dans la partie précédente, nous avons découpé une seule ligne. Mais nous en avons plusieurs, et selon l'exemple à choisir nous pourrions en avoir 5, 10, 100, etc.
En utilisant l'instruction for item in liste:
, nous créons une boucle qui va réaliser une itération pour chaque objet de la liste. Par exemple :
for item in ["chat", "chien", "oiseau"]:
print(item)
# Ce code simple aura pour effet d'afficher :
chat
chien
oiseau
liste = ["poisson", "abeille", "guépard"]
for mot in liste:
print(mot)
# Ce code aura pour effet d'afficher :
poisson
abeille
guépart
Sur la base de cet exemple, et en prenant en compte ce qui a été expliqué dans les deux parties précédentes, nous allons pouvoir, au lieu de découper une seule ligne, découper toutes les lignes les unes après les autres. Le code suivant est l'exemple final complet vu en cours mardi :
csvData = '''
activité, durée, importance
devoirs,4h,très important
Valorant,4h, important
Lecture,4h, important
Jardinage,2h,important
'''
lignes = csvData.split('\n')
for ligne in lignes:
print(ligne.split(', '))
Nous avions également vu en toute fin de démonstration comment faire pour enregistrer les valeurs au lieu de simplement les afficher, mais chaque chose en son temps : nous avons déjà bien assez de choses à revoir sur ce simple exemple.@