Importation et exportation CSV - SQLite avec Python

importer et exporter des données d'un fichier csv vers une base de données sqlite

1. À propos de l'importation et de l'exportation CSV - SQLite avec Python

Python fournit dans sa bibliothèque standard les modules csv et sqlite3. Leur utilisation conjointe permet de transférer facilement des données entre un fichier CSV et une base de données SQLite, sans installer de bibliothèque supplémentaire.

L'importation CSV vers SQLite consiste à lire les lignes d'un fichier CSV puis à les insérer dans une table de la base de données. L'exportation SQLite vers CSV réalise l'opération inverse : une requête SQL récupère des enregistrements qui sont ensuite écrits dans un fichier CSV.

Le programme suivant vérifie que les deux modules nécessaires sont disponibles.

Sortie :

Cette association est particulièrement utile pour importer des données provenant d'un tableur, sauvegarder le contenu d'une table, produire des fichiers destinés à Excel ou LibreOffice et transférer des données entre différentes applications.

2. Créer une base de données SQLite et une table

Avant d'importer des données CSV, nous allons créer une base SQLite nommée ecole.db. La fonction sqlite3.connect() ouvre la base si elle existe et la crée automatiquement dans le cas contraire.

Le programme suivant crée une table etudiants possédant les colonnes id, nom, age, ville et note. L'identifiant est généré automatiquement par SQLite.

Sortie :

L'appel à commit() valide les modifications apportées à la base. La méthode close() ferme ensuite la connexion.

Nous pouvons vérifier la présence de la table en interrogeant le catalogue interne de SQLite.

Sortie :

La base de données est maintenant prête à recevoir les données provenant du fichier CSV.

3. Préparer un fichier CSV à importer dans SQLite

Considérons un fichier nommé etudiants.csv. Sa première ligne contient les noms des colonnes et les lignes suivantes contiennent les données à importer.

Le fichier utilisé dans nos exemples possède le contenu suivant.

Sortie :

Avant l'importation, nous pouvons vérifier le contenu du fichier avec csv.reader(). La fonction next() permet ici de récupérer séparément l'en-tête.

Sortie :

Les données retournées par csv.reader() sont des chaînes de caractères. Nous pourrons donc convertir les colonnes age et note avant leur insertion dans SQLite.

4. Importer un fichier CSV dans SQLite avec csv.reader()

Pour réaliser une importation CSV vers SQLite, nous ouvrons simultanément le fichier CSV et la base de données. Chaque ligne lue est ensuite insérée avec une requête INSERT INTO.

Le programme suivant ignore l'en-tête avec next(), convertit l'âge en entier et la note en nombre réel, puis insère chaque étudiant dans la table.

Sortie :

Les points d'interrogation présents dans la requête sont des paramètres SQL. Il est préférable de transmettre les valeurs séparément plutôt que de construire une requête SQL par concaténation de chaînes.

Nous pouvons maintenant interroger la table pour vérifier les enregistrements importés.

Sortie possible :

Les données du fichier CSV sont désormais enregistrées dans une véritable table SQLite et peuvent être interrogées avec le langage SQL.

5. Importer plusieurs lignes efficacement avec executemany()

Lorsque plusieurs lignes doivent être insérées, la méthode executemany() permet de transmettre une collection de paramètres à une même requête SQL. Cette approche évite d'appeler explicitement execute() dans une boucle pour chaque insertion.

Dans l'exemple suivant, nous lisons les données CSV, nous les convertissons puis nous les plaçons dans une liste avant de les transmettre à executemany().

Sortie :

Dans un test réel, il faut éviter de réexécuter cet exemple sur une table contenant déjà les mêmes étudiants si l'on ne souhaite pas créer de doublons. On peut repartir d'une table vide, définir des contraintes d'unicité adaptées au modèle de données ou prévoir une stratégie explicite de mise à jour.

Pour connaître le nombre total d'enregistrements présents dans la table, nous pouvons utiliser COUNT(*).

Sortie possible :

Cette sortie suppose que la table contenait quatre étudiants et que les données n'ont pas été importées plusieurs fois.

6. Vérifier et convertir les données avant l'importation

Un fichier CSV provenant d'une source externe peut contenir des lignes incomplètes, des nombres invalides ou des champs vides. Il est donc préférable de vérifier les données avant de les insérer dans SQLite.

Le programme suivant contrôle que chaque ligne contient quatre colonnes et que l'âge et la note peuvent être convertis respectivement en int et float.

Sortie :

Une fois les données contrôlées, nous pouvons les insérer dans SQLite avec executemany().

Sortie :

Pour une importation importante, il est également utile de gérer les erreurs SQLite. Le contexte transactionnel de la connexion peut faciliter l'annulation automatique d'une transaction lorsqu'une exception survient.

Sortie possible :

La validation des données avant l'insertion permet d'obtenir une base plus cohérente et facilite le diagnostic lorsqu'un fichier CSV contient des informations incorrectes.

7. Exporter une table SQLite vers un fichier CSV

L'opération inverse consiste à effectuer une exportation SQLite vers CSV. Nous récupérons les lignes d'une table avec SELECT puis nous utilisons csv.writer() pour les enregistrer dans un fichier.

Le programme suivant exporte l'ensemble de la table etudiants vers le fichier export_etudiants.csv.

Sortie possible :

Le fichier CSV obtenu contient alors l'en-tête suivi des enregistrements extraits de SQLite.

Sortie :

Pour un très grand résultat, il n'est pas obligatoire d'utiliser fetchall(). Le curseur SQLite peut être parcouru directement afin d'écrire progressivement les lignes.

Sortie :

Cette approche évite de charger explicitement l'ensemble du résultat dans une liste avant son écriture.

8. Exporter le résultat d'une requête SQL vers CSV

Il n'est pas nécessaire d'exporter toute une table. Nous pouvons exécuter une requête SQL contenant WHERE, ORDER BY ou d'autres clauses puis exporter uniquement son résultat.

Le programme suivant sélectionne les étudiants ayant une note supérieure ou égale à 15 et les classe par note décroissante.

Sortie :

Avec les données de notre exemple, le fichier généré contient uniquement les étudiants répondant au critère demandé.

Sortie :

Nous pouvons également récupérer automatiquement les noms des colonnes retournées par une requête grâce à l'attribut cursor.description.

Sortie :

Cette technique devient particulièrement pratique pour créer une fonction d'exportation générique capable de produire automatiquement l'en-tête du fichier CSV.

9. Créer un programme complet d'importation et d'exportation CSV - SQLite

Pour rendre le programme réutilisable, nous pouvons regrouper les opérations dans des fonctions. Une première fonction importe un fichier CSV dans SQLite et une seconde exporte les données de la table vers un nouveau fichier CSV.

Le programme suivant présente une version complète associant csv.reader(), csv.writer(), sqlite3 et des requêtes SQL paramétrées.

Sortie possible :

Cette sortie suppose une table initialement vide. Si le programme est exécuté plusieurs fois sans supprimer les données précédentes ou sans contrainte empêchant les doublons, de nouveaux enregistrements seront ajoutés à chaque importation.

Nous pouvons enfin vérifier directement les données exportées en relisant le fichier généré.

Sortie possible :

Cette architecture peut ensuite être adaptée à des fichiers de produits, clients, commandes, notes scolaires ou tout autre ensemble de données tabulaires.

10. À retenir !

L'association des modules csv et sqlite3 permet de construire facilement une passerelle entre les fichiers CSV et une base de données SQLite. Les deux modules étant inclus dans la bibliothèque standard, aucune dépendance externe n'est nécessaire pour réaliser les opérations de base.

  • csv.reader() permet de parcourir les lignes d'un fichier CSV.
  • sqlite3.connect() permet d'ouvrir ou de créer une base SQLite.
  • INSERT INTO permet d'insérer dans SQLite les données provenant du fichier CSV.
  • Les requêtes SQL doivent utiliser des paramètres plutôt qu'une concaténation des valeurs dans la chaîne SQL.
  • executemany() permet d'appliquer une même requête à plusieurs ensembles de paramètres.
  • Les valeurs numériques provenant de csv.reader() peuvent être converties avec int() et float().
  • SELECT permet de récupérer les données SQLite à exporter.
  • csv.writer() et writerows() permettent d'écrire les résultats SQL dans un fichier CSV.
  • cursor.description peut servir à récupérer automatiquement les noms des colonnes d'un résultat SQL.
  • Il est recommandé de valider les données, de gérer les transactions et de prévoir une stratégie contre les doublons pour les importations réelles.

Le principe général d'une importation CSV vers SQLite peut être résumé par le programme suivant.

Sortie :

L'opération inverse consiste à exécuter une requête SELECT puis à transmettre ses résultats à csv.writer().

Sortie :

 




Auteur : Younes Derfoufi
Lieu de travail : CRMEF OUJDA
Site Web : www.tresfacile.net
Chaine YouTube : https://www.youtube.com/user/InformatiquesFacile
Me contacter : https://www.tresfacile.net/me-contacter/


Leave a Reply

Your email address will not be published. Required fields are marked *