đŸŒČ SĂ©ance 2.4 - Lecture et Ă©criture de fichiers
Cours · Semaine 2 - Programmation modulaire · Mission : ForĂȘt borĂ©ale

Compétence 0F01 : Développer des programmes informatiques en vue d'automatiser la résolution de problÚmes dans un contexte scientifique.

Objectifs de la séance¶

  • Écrire et lire des fichiers texte et CSV
  • Utiliser la bibliothĂšque csv
  • Lire et Ă©crire des fichiers Excel avec pandas
  • Lire et produire du XML
  • AccĂ©der Ă  des donnĂ©es distantes par leur URL

Contenus essentiels¶

  • Formats de fichiers (CSV, Excel, XML, JSON)
  • BibliothĂšques pour la lecture de fichiers de donnĂ©es
  • Aller chercher des donnĂ©es lĂ  oĂč elles vivent (disque, Internet)

Calepin Colab. Exécutez chaque bloc de code avec Maj+Entrée. Les fichiers que vous créez apparaissent dans le panneau Fichiers (à gauche dans Colab). Modifiez, expérimentez, recommencez.

📝 1. Écrire un fichier¶

On ouvre un fichier en Ă©criture avec open(nom, 'w'), on y Ă©crit du texte avec .write(...), et le with referme le fichier tout seul. Un fichier CSV n'est qu'un fichier texte oĂč les valeurs d'une ligne sont sĂ©parĂ©es par des virgules.

In [ ]:
contenu = 'jour,temperature\n1,20.1\n2,21.5\n3,19.8\n'
with open('releves-meteo.csv', 'w', encoding='utf-8') as fichier:
    fichier.write(contenu)
print('Fichier écrit.')

📖 2. Lire un fichier ligne par ligne¶

On ouvre en lecture avec open(nom, 'r') et on parcourt le fichier comme une suite de lignes. .strip() enlĂšve le retour Ă  la ligne au bout.

In [ ]:
with open('releves-meteo.csv', 'r', encoding='utf-8') as fichier:
    for ligne in fichier:
        print(ligne.strip())

đŸ§Ÿ 3. La bibliothĂšque csv¶

Le module csv dĂ©coupe chaque ligne en liste de valeurs (Ă  notre place). next(lecteur) lit la premiĂšre ligne, l'en-tĂȘte.

In [ ]:
import csv
with open('releves-meteo.csv', 'r', encoding='utf-8') as fichier:
    lecteur = csv.reader(fichier)
    entete = next(lecteur)
    print('Colonnes :', entete)
    for ligne in lecteur:
        print(ligne)

📈 4. Les fichiers Excel avec pandas¶

pandas range les données dans un tableau (DataFrame). to_excel écrit un vrai fichier .xlsx, read_excel le relit. Pratique quand les données viennent d'un chiffrier.

In [ ]:
import pandas as pd
mesures = pd.DataFrame({'echantillon': ['A', 'B', 'C'], 'pH': [7.0, 5.2, 8.1]})
mesures.to_excel('mesures.xlsx', index=False)
relu = pd.read_excel('mesures.xlsx')
print(relu)

đŸ§© 5. Le format JSON¶

Le JSON ressemble à un dictionnaire Python : des paires clé: valeur, parfois imbriquées. json.dump écrit un dictionnaire dans un fichier, json.load le relit, et json.loads lit directement une chaßne de texte.

In [ ]:
import json
station = {'station': 'ForĂȘt', 'releves': [18.4, 21.0, 19.7]}
with open('station.json', 'w', encoding='utf-8') as fichier:
    json.dump(station, fichier)
with open('station.json', 'r', encoding='utf-8') as fichier:
    relu = json.load(fichier)
print(relu['releves'])

đŸ· 6. Le format XML¶

Le XML range les données dans des balises imbriquées. xml.etree.ElementTree permet de parcourir ces balises et de lire leurs attributs avec .get('nom').

In [ ]:
import xml.etree.ElementTree as ET
texteXml = '<mesures><mesure ph="7.0"/><mesure ph="5.2"/></mesures>'
racine = ET.fromstring(texteXml)
for mesure in racine.findall('mesure'):
    print('pH :', mesure.get('ph'))

🌐 7. Lire des donnĂ©es distantes¶

Les données ne sont pas toujours sur votre disque. urllib.request va chercher un fichier par son URL sur Internet, exactement comme un navigateur. (Cette section nécessite une connexion Internet.)

In [ ]:
import urllib.request
url = 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv'
with urllib.request.urlopen(url) as reponse:
    texte = reponse.read().decode('utf-8')
lignes = texte.splitlines()
print('PremiĂšre ligne :', lignes[0])
print('Nombre de lignes :', len(lignes))

📌 Rappel de vocabulaire. Un mĂȘme tableau de donnĂ©es peut vivre dans plusieurs formats : le CSV (texte, valeurs sĂ©parĂ©es par des virgules), l'Excel (.xlsx, un chiffrier), le XML (balises imbriquĂ©es) ou le JSON (paires clĂ©-valeur). Programmer, c'est souvent traduire d'un format Ă  l'autre.

đŸ§Ș EXERCICES (obligatoires)
Lire et écrire des fichiers **CSV** et **Excel**. Ces **5 exercices sont à remettre**. Complétez les cellules marquées `# A COMPLETER`.

Obligatoire 1. Écrivez un fichier temperatures.csv contenant l'en-tĂȘte jour,celsius puis trois relevĂ©s de votre choix. Utilisez open(..., 'w') et .write(...).

In [ ]:
# A COMPLETER (obligatoire 1)

Obligatoire 2. La premiĂšre cellule prĂ©pare le fichier planetes.csv : exĂ©cutez-la sans la modifier, le fichier apparaĂźt alors dans le panneau Fichiers. Dans la cellule suivante, lisez planetes.csv ligne par ligne et affichez chaque ligne sans l'en-tĂȘte (sautez la premiĂšre ligne).

In [ ]:
# CELLULE DE PRÉPARATION - exĂ©cutez-la sans la modifier (elle crĂ©e le fichier).
contenu = 'planete,lunes\nMars,2\nJupiter,95\nTerre,1\n'
with open('planetes.csv', 'w', encoding='utf-8') as fichier:
    fichier.write(contenu)
import os
print('Fichier planetes.csv créé avec succÚs.')
print('Chemin exact du fichier :', os.path.abspath('planetes.csv'))
print('POUR LE VOIR : cliquez sur le dossier 📁 dans la barre de gauche, ce qui ouvre le panneau Fichiers.')
print('Le fichier se trouve dans le dossier /content (le dossier principal affiché). Bouton Actualiser (flÚche ronde) au besoin.')
In [ ]:
# A COMPLETER (obligatoire 2)
# Lisez planetes.csv ligne par ligne et affichez chaque ligne sans l'en-tĂȘte.

Obligatoire 3. Avec la bibliothĂšque csv et csv.writer, Ă©crivez le fichier especes.csv avec l'en-tĂȘte espece,nombre et au moins trois espĂšces observĂ©es en forĂȘt.

In [ ]:
# A COMPLETER (obligatoire 3)
import csv

Obligatoire 4. La premiÚre cellule prépare pluie.csv (colonne mm) : exécutez-la sans la modifier. Ensuite, avec csv.reader, calculez et affichez la précipitation moyenne.

In [ ]:
# CELLULE DE PRÉPARATION - exĂ©cutez-la sans la modifier (elle crĂ©e le fichier).
contenu = 'jour,mm\n1,4.2\n2,0.0\n3,11.5\n4,6.3\n'
with open('pluie.csv', 'w', encoding='utf-8') as fichier:
    fichier.write(contenu)
import os
print('Fichier pluie.csv créé avec succÚs.')
print('Chemin exact du fichier :', os.path.abspath('pluie.csv'))
print('POUR LE VOIR : cliquez sur le dossier 📁 dans la barre de gauche, ce qui ouvre le panneau Fichiers.')
print('Le fichier se trouve dans le dossier /content (le dossier principal affiché). Bouton Actualiser (flÚche ronde) au besoin.')
In [ ]:
# A COMPLETER (obligatoire 4)
import csv
# Lisez pluie.csv avec csv.reader et calculez la moyenne de la colonne mm.

Obligatoire 5. La premiÚre cellule prépare le fichier Excel labo.xlsx (elle montre au passage comment l'écrire avec to_excel) : exécutez-la sans la modifier. Ensuite, avec pandas, lisez labo.xlsx (read_excel) et affichez le tableau.

In [ ]:
# CELLULE DE PRÉPARATION - exĂ©cutez-la sans la modifier (elle crĂ©e le fichier).
import pandas as pd
labo = pd.DataFrame({'echantillon': ['A', 'B', 'C'], 'pH': [7.0, 5.2, 8.1]})
labo.to_excel('labo.xlsx', index=False)
import os
print('Fichier labo.xlsx créé avec succÚs.')
print('Chemin exact du fichier :', os.path.abspath('labo.xlsx'))
print('POUR LE VOIR : cliquez sur le dossier 📁 dans la barre de gauche, ce qui ouvre le panneau Fichiers.')
print('Le fichier se trouve dans le dossier /content (le dossier principal affiché). Bouton Actualiser (flÚche ronde) au besoin.')
In [ ]:
# A COMPLETER (obligatoire 5)
import pandas as pd
# Lisez labo.xlsx avec read_excel et affichez le tableau.
🚀 EXERCICES (intermĂ©diaires, facultatifs)
Les formats **JSON** et **XML**. À faire une fois les obligatoires terminĂ©s.

IntermĂ©diaire 1 (JSON, Ă©crire et relire). CrĂ©ez un dictionnaire dĂ©crivant une station mĂ©tĂ©o (nom, et une liste releves de trois tempĂ©ratures). Écrivez-le dans station.json avec json.dump, puis relisez-le avec json.load et affichez la liste des relevĂ©s.

In [ ]:
# A COMPLETER (intermédiaire 1)
import json

Intermédiaire 2 (JSON depuis une chaßne). Le code de départ fournit une chaßne JSON. Avec json.loads, transformez-la en dictionnaire et affichez le pH de chaque échantillon.

In [ ]:
# A COMPLETER (intermédiaire 2)
import json
texteJson = '{"echantillons": [{"nom": "A", "pH": 7.0}, {"nom": "B", "pH": 5.2}, {"nom": "C", "pH": 8.1}]}'

Intermédiaire 3 (JSON, calcul). La premiÚre cellule prépare releves.json (une liste de relevés jour/temperature) : exécutez-la sans la modifier. Ensuite, relisez le fichier et calculez la température moyenne.

In [ ]:
# CELLULE DE PRÉPARATION - exĂ©cutez-la sans la modifier (elle crĂ©e le fichier).
import json
releves = [{'jour': 1, 'temperature': 18.4}, {'jour': 2, 'temperature': 21.0}, {'jour': 3, 'temperature': 19.7}]
with open('releves.json', 'w', encoding='utf-8') as fichier:
    json.dump(releves, fichier)
import os
print('Fichier releves.json créé avec succÚs.')
print('Chemin exact du fichier :', os.path.abspath('releves.json'))
print('POUR LE VOIR : cliquez sur le dossier 📁 dans la barre de gauche, ce qui ouvre le panneau Fichiers.')
print('Le fichier se trouve dans le dossier /content (le dossier principal affiché). Bouton Actualiser (flÚche ronde) au besoin.')
In [ ]:
# A COMPLETER (intermédiaire 3)
import json
# Relisez releves.json (json.load) et calculez la temperature moyenne.

Intermédiaire 4 (XML depuis une chaßne). Une chaßne XML décrit des mesures. Avec xml.etree.ElementTree et fromstring, extrayez et affichez le pH de chaque mesure.

In [ ]:
# A COMPLETER (intermédiaire 4)
import xml.etree.ElementTree as ET
texteXml = '<mesures><mesure ph="7.0"/><mesure ph="5.2"/><mesure ph="8.1"/></mesures>'

IntermĂ©diaire 5 (XML, Ă©crire et relire). Écrivez un fichier planetes.xml contenant deux balises <planete nom="..." lunes="..."/>, puis relisez-le avec ET.parse et affichez chaque planĂšte avec son nombre de lunes.

In [ ]:
# A COMPLETER (intermédiaire 5)
import xml.etree.ElementTree as ET
đŸȘœ EXERCICES PLUS DIFFICILES (avancĂ©s, facultatifs)
Accéder à des **données distantes** par leur **URL**, et **téléverser** vos propres fichiers dans Colab. Les exercices distants nécessitent Internet ; les exercices d'upload utilisent les fichiers fournis (dossier `donnees-jour-4`).

AvancĂ© 1 (donnĂ©e distante, urllib). Avec urllib.request, tĂ©lĂ©chargez le jeu de donnĂ©es iris (fleurs) Ă  l'URL fournie et affichez sa premiĂšre ligne (l'en-tĂȘte) ainsi que le nombre total de lignes.

In [ ]:
# A COMPLETER (avancé 1)
import urllib.request
url = 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv'

AvancĂ© 2 (donnĂ©e distante, pandas). Avec pandas.read_csv, chargez directement le mĂȘme jeu iris depuis son URL et affichez la moyenne de la colonne sepal_length.

In [ ]:
# A COMPLETER (avancé 2)
import pandas as pd
url = 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv'

Avancé 3 (JSON distant). Avec urllib.request et le module json, lisez la ressource JSON à l'URL fournie (une API de test publique) et affichez la valeur de la clé title.

In [ ]:
# A COMPLETER (avancé 3)
import urllib.request
import json
url = 'https://jsonplaceholder.typicode.com/todos/1'

Avancé 4 (gérer une erreur réseau). Tentez d'ouvrir une URL qui n'existe pas et gérez proprement l'erreur avec try/except : affichez un message clair au lieu de laisser le programme planter.

In [ ]:
# A COMPLETER (avancé 4)
import urllib.request
import urllib.error
url = 'https://exemple-inexistant.invalid/donnees.csv'

Avancé 5 (téléverser un CSV). Dans Colab, téléversez le fichier planetes.csv (fourni) avec files.upload(), puis lisez-le avec csv et affichez le nom de chaque planÚte avec son nombre de lunes.

Le sélecteur de fichiers s'ouvre : choisissez planetes.csv. files.upload() ne fonctionne que dans Colab.

In [ ]:
# A COMPLETER (avancé 5)
from google.colab import files
import csv
fichiersTeleverses = files.upload()   # choisir planetes.csv

Avancé 6 (téléverser un Excel). Dans Colab, téléversez le fichier echantillons-labo.xlsx (fourni) avec files.upload(), puis avec pandas affichez le pH moyen des échantillons.

Choisissez echantillons-labo.xlsx dans le sélecteur.

In [ ]:
# A COMPLETER (avancé 6)
from google.colab import files
import pandas as pd
fichiersTeleverses = files.upload()   # choisir echantillons-labo.xlsx

SOLUTIONS (document de la prof)¶

Cette section contient les corrigés. Pour produire la version étudiante, supprimez toutes les cellules à partir d'ici.

🚀 Solutions - intermĂ©diaires¶

đŸȘœ Solutions - avancĂ©s¶


Lien avec le projet de la semaine¶

Le Projet 2 part de données rangées dans un fichier. Savoir les lire (CSV, Excel), les charger en tableau et les analyser est exactement le premier geste du projet. Les formats XML et les accÚs distants ouvrent la porte aux vraies sources de données scientifiques.

Pour aller plus loin (facultatif)¶

  • Cherchez csv.DictReader : il lit chaque ligne comme un dictionnaire.
  • Avec pandas, comparez read_csv, read_excel et read_json.
  • Le module json traduit entre texte JSON et dictionnaires Python.