Vivre seul, c'est prendre plaisir à manger du céleri rémoulade dans son papier d'emballage.

Ouvrir un fichier CSV de grande taille peut être difficile pour diverses raisons :
Toujours prêt à sortir mon Python pour répondre à vos demandes, je vous ai proposé il y a 7 ans un petit script qui ouvre le fichier fichier.csv (par défaut, mais c'est modifiable), rédigé en Latin-1 (par défaut, mais c'est modifiable), le coupe en fichiers CSV de 100 000 lignes (par défaut, mais c'est modifiable) appelés export_1.csv, export_2.csv... (par défaut, mais c'est modifiable).
# -*- coding: utf-8 -*-#csv_decoupe est une application python 3.6.4 par wouf 09/07/2019#qui découpe un csv#constantesfichier="fichier.csv"export="export"nblignes=100000lang="Latin-1"compteur=0first_export=export+"_1.csv"g=open(first_export,'a',encoding=lang)page=1with open(fichier,encoding=lang) as f : for line in f : compteur+=1 if compteur==nblignes: g.close() print('|',end="" ) page+=1 compteur=0 lexport=export+"_" +str(page)+".csv" g=open(lexport,'a',encoding=lang) g.write(line)try: g.close()except: pass
En 2019, ce court script faisait parfaitement le job :
Sept ans après la création de ce script, mes connaissances Python ont évolué. Le code de 2019 faisait parfaitement le job, mais aujourd'hui je l'écrirais différemment :
pathlib plutôt que manipulation de chaînes pour les fichierstry/except finalfirst_export → gestion plus claire)flush=True pour le retour visuelVoyons concrètement ce qui change.
Le même algorithme, écrit avec les pratiques actuelles :
# -*- coding: utf-8 -*-# csv_decoupe - Version 2026 par wouf# Découpe un fichier CSV en plusieurs morceauxfrom pathlib import Path# Configurationfichier = Path("fichier.csv")export_base = "export"nb_lignes = 100000encoding = "latin-1"# Traitementpage = 1compteur = 0with fichier.open(encoding=encoding) as lecture: sortie = Path(f"{export_base}_{page}.csv").open('w', encoding=encoding) for ligne in lecture: sortie.write(ligne) compteur += 1 if compteur == nb_lignes: sortie.close() print('|', end='', flush=True) page += 1 compteur = 0 sortie = Path(f"{export_base}_{page}.csv").open('w', encoding=encoding) sortie.close()print(f"\n✓ {page} fichiers créés")
L'utilisation de from pathlib import Path remplace la manipulation de chaînes de caractères pour les chemins de fichiers. Path est un objet qui connaît les spécificités du système d'exploitation (Windows, Linux, Mac) et offre des méthodes claires comme .open(), .exists(), ou .stem. C'est devenu la méthode recommandée depuis Python 3.4 et aujourd'hui, en 2026, son usage est totalement généralisé.
Dans l'ancien code, first_export était créé séparément avant la boucle, puis les fichiers suivants utilisaient une autre logique. Cette duplication crée une asymétrie inutile. En initialisant directement page = 1 et en utilisant la même logique pour tous les fichiers, le code devient plus cohérent et plus facile à maintenir.
Par défaut, Python met en buffer les affichages console pour des raisons de performance. Avec print('|', end='', flush=True), on force l'affichage immédiat de chaque pipe, offrant un retour visuel instantané de la progression. Sans ce paramètre, tous les pipes pourraient s'afficher d'un coup à la fin.
Le try/except était nécessaire en 2019 pour gérer le cas où le fichier g était déjà fermé. Avec la nouvelle structure où sortie.close() est appelé de manière déterministe après la boucle, ce bloc devient superflu. Le code est plus clair car il ne masque plus d'erreurs potentielles.
L'ajout de print(f"\n✓ {page} fichiers créés") donne une information claire à l'utilisateur sur le nombre de fichiers générés. C'est un retour d'information utile qui n'existait pas dans la version originale où seuls les pipes indiquaient la progression.
En 2026, la solution la plus rapide et la plus élégante pour découper un fichier CSV est... de ne pas coder du tout !
Sous Linux et Mac, l'utilitaire split est préinstallé et fait exactement ce travail en une seule ligne de commande :
split -l 100000 --additional-suffix=.csv fichier.csv export_
Décortiquons cette commande :
split : l'outil de découpe de fichiers-l 100000 : découpe tous les 100 000 lignes (l pour "lines")--additional-suffix=.csv : ajoute l'extension .csv aux fichiers créésfichier.csv : le fichier source à découperexport_ : le préfixe des fichiers générésRésultat : des fichiers nommés export_aa.csv, export_ab.csv, export_ac.csv... créés en quelques secondes, même pour des fichiers de plusieurs gigaoctets.
Là où notre script Python traite environ 50 000 lignes par seconde, split peut atteindre plusieurs millions de lignes par seconde. Sur un fichier de 10 millions de lignes (environ 2 Go) :
3-4 minutes
10-15 secondes
Cette différence s'explique par le fait que split est un utilitaire système écrit en C, optimisé depuis des décennies, alors que Python ajoute une couche d'interprétation.
Windows ne dispose pas nativement de split, mais vous pouvez l'utiliser via :
Une fois WSL ou Git Bash installé, la commande fonctionne exactement de la même manière.
Malgré sa puissance, split a quelques limites :
Privilégiez split si :
Gardez Python si :
Dans mon cas, j'ai créé ce script Python en 2019 pour répondre à une demande spécifique d'une collègue qui travaillait sous Windows. Aujourd'hui, avec WSL facilement accessible, je lui conseillerais probablement split pour un usage ponctuel, mais je conserve le script Python comme outil pédagogique pour montrer la manipulation de fichiers en Python.
Mon travail est sous licence Creative Commons.
N'hésitez pas à me contacter si vous détectez la moindre imperfection, ou si vous imaginez une amélioration potentielle !
Open source et gratuité n'empêchent ni les dons ni les remerciements 😉
Un euro ou deux pour m'aider à payer le serveur ?
💙 Faire un don sur PayPal
Partager :