Partie 1 · Import
Importer des données : CSV, JSON, SQL et leurs pièges
Chaque format a sa fonction pandas, et son équivalent Python standard :
| Format | pandas | Python pur |
|---|---|---|
| Fichier plat (CSV, TSV) | pd.read_csv() : sep, encoding, header | module csv (csv.DictReader) |
| Excel | pd.read_excel() : sheet_name (peut exiger openpyxl) | hors bibliothèque standard |
| JSON | pd.read_json() : attention aux structures imbriquées (orient) | module json |
| Base SQL | pd.read_sql() : connexion + requête ou nom de table | module sqlite3 |
| Autres | Parquet, pickle (sérialisation Python) | pickle |
Paramètres du TP : index_col (colonne servant d'index), header=None (fichier sans en-tête), usecols (ne charger que certaines colonnes), skiprows (ignorer les premières lignes), dtype (forcer des types).
Vérifie que tu as compris
read_csv l'indique ?Lire un CSV avec le module csv
import csv, io texte = "id;nom;salaire\n1;Alice;42000\n2;Bob;38000" lignes = list(csv.DictReader(io.StringIO(texte), delimiter=";")) # [{'id': '1', 'nom': 'Alice', 'salaire': '42000'}, ...]
Remarque essentielle : tout est lu comme du texte. '42000' n'est pas un nombre : il faut convertir (int(), float()), c'est l'équivalent de dtype / .astype(). Le séparateur par défaut est la virgule : un fichier français en ; lu avec la virgule donne une seule colonne.
À toi de coder
JSON imbriqué et SQL
Le JSON est courant sur le web et peut être imbriqué : il faut le normaliser (aplatir) pour obtenir un tableau. En SQL, on se connecte puis on exécute une requête dont le résultat devient un tableau :
import json, sqlite3 data = json.loads('{"nom": "Alice", "adresse": {"ville": "Paris"}}') plat = {"nom": data["nom"], "ville": data["adresse"]["ville"]} con = sqlite3.connect(":memory:") con.execute("CREATE TABLE t (id INTEGER, nom TEXT)") con.execute("INSERT INTO t VALUES (1, 'Alice')") con.row_factory = sqlite3.Row lignes = [dict(r) for r in con.execute("SELECT * FROM t")]
À toi de coder
Les problèmes classiques à l'import
- Encodage : fichier non UTF-8 (souvent
latin-1) donne des caractères illisibles (« é » au lieu de « é »). Solution : préciserencoding(Python :open(f, encoding="latin-1")). - Mauvaise détection des types : un entier lu comme texte (
object). Correction avecdtypeà l'import ou.astype()après. - Fichiers volumineux : lire par blocs avec
chunksizepour ne pas saturer la mémoire (Python : itérer sur le fichier ligne à ligne). - Identifiants : le TP population force
codgeoenstring: le code01001deviendrait1001en entier (zéro initial perdu) (précision ajoutée).
Les dtypes
| Famille | Types |
|---|---|
| Numérique | int64, float64 (64 = taille en bits) |
| Texte | object (générique, chaînes ou types mixtes), string (plus moderne, plus efficace) |
| Temporel | datetime64[ns] |
| Booléen | bool |
Pour des chaînes très répétitives (faible cardinalité), le type category économise de la mémoire.
Vérifie que tu as compris
object) à l'import. Quelle correction le cours propose-t-il ?Vérifie que tu as compris
01001 en string plutôt qu'en entier ?