Apprendre à manipuler efficacement les fichiers CSV en Python est essentiel pour de nombreuses tâches telles que l’analyse de données ou la création de rapports. En particulier, l’utilisation d’une boucle for
pour itérer sur chaque ligne permet de manipuler facilement les données CSV de manière intuitive. Cet article vous explique en détail comment utiliser la bibliothèque standard csv
de Python, de la prise en main de base aux méthodes de traitement plus efficaces. Vous pourrez ainsi comprendre la meilleure façon de traiter de grandes quantités de données.
Comment ouvrir un fichier CSV en Python
La première étape pour manipuler un fichier CSV est de l’ouvrir et de charger les données correctement. En Python, on utilise la fonction open
de la bibliothèque standard pour ouvrir un fichier CSV.
Méthode de base pour ouvrir un fichier
Avec la fonction open
de Python, vous pouvez ouvrir un fichier CSV en mode lecture seule. Voici un exemple de code pour ouvrir le fichier example.csv
:
with open('example.csv', mode='r', encoding='utf-8') as file:
print(file.read())
Pourquoi utiliser la déclaration with
L’utilisation de la déclaration with
vous permet d’ouvrir et de fermer le fichier en toute sécurité sans avoir besoin d’appeler explicitement file.close()
. Cela garantit que le fichier sera correctement fermé même en cas d’erreur, ce qui permet d’éviter les fuites de ressources.
Préparation à l’utilisation du module CSV
Une fois le fichier ouvert, vous pouvez utiliser le module csv
pour traiter son contenu. Ce module fournit des outils pour lire des données séparées par des virgules sous un format facile à manipuler. Nous examinerons un exemple spécifique dans les sections suivantes.
Itération basique avec csv.reader
En utilisant l’objet reader
du module csv
, vous pouvez itérer sur les lignes d’un fichier CSV. Cette méthode est simple et permet de récupérer chaque ligne sous forme de liste, facilitant ainsi le traitement des données.
Utilisation de base de csv.reader
Voici un exemple de code qui montre comment lire un fichier CSV en utilisant csv.reader
:
import csv
# Ouvrir le fichier CSV
with open('example.csv', mode='r', encoding='utf-8') as file:
reader = csv.reader(file) # Créer le lecteur CSV
for row in reader: # Itérer sur chaque ligne
print(row) # Afficher la liste de chaque ligne
Format des données récupérées
Les éléments row
renvoyés par csv.reader
sont des listes où chaque cellule de la ligne est un élément sous forme de chaîne de caractères. Par exemple, si vous traitez le fichier CSV suivant :
Name,Age,City
Alice,30,New York
Bob,25,Los Angeles
L’affichage sera le suivant :
['Name', 'Age', 'City']
['Alice', '30', 'New York']
['Bob', '25', 'Los Angeles']
Comment ignorer la première ligne (en-tête)
Si vous souhaitez ignorer la ligne d’en-tête, vous pouvez utiliser la fonction next()
:
with open('example.csv', mode='r', encoding='utf-8') as file:
reader = csv.reader(file)
next(reader) # Ignorer la ligne d'en-tête
for row in reader:
print(row)
Points importants
- Par défaut,
csv.reader
reconnaît la virgule (,
) comme séparateur. Si un autre séparateur est utilisé, vous devez spécifier l’argumentdelimiter
. - Si vous travaillez avec beaucoup de données, veillez à gérer l’utilisation de la mémoire pour éviter des problèmes de performance.
Dans la section suivante, nous allons examiner comment extraire les valeurs de certaines colonnes et les traiter spécifiquement.
Comment extraire et traiter les valeurs des colonnes
En utilisant csv.reader
, vous pouvez récupérer chaque ligne sous forme de liste, ce qui permet d’extraire facilement les valeurs de colonnes spécifiques et de les traiter. Cette approche permet de se concentrer efficacement sur les données nécessaires.
Exemple simple d’extraction d’une colonne spécifique
Voici un exemple de code pour extraire et traiter la deuxième colonne (par exemple : l’âge) :
import csv
with open('example.csv', mode='r', encoding='utf-8') as file:
reader = csv.reader(file)
next(reader) # Ignorer l'en-tête
for row in reader:
# Extraire la valeur de la deuxième colonne (index 1)
age = row[1]
print(f"Age: {age}")
Si le fichier CSV ressemble à ceci :
Name,Age,City
Alice,30,New York
Bob,25,Los Angeles
Le résultat de l’exécution sera :
Age: 30
Age: 25
Traitement combiné de plusieurs colonnes
Si vous souhaitez utiliser plusieurs colonnes simultanément, vous pouvez spécifier les colonnes nécessaires à l’aide d’indices de liste.
with open('example.csv', mode='r', encoding='utf-8') as file:
reader = csv.reader(file)
next(reader) # Ignorer l'en-tête
for row in reader:
name = row[0] # Première colonne
city = row[2] # Troisième colonne
print(f"{name} lives in {city}.")
Le résultat de l’exécution sera :
Alice lives in New York.
Bob lives in Los Angeles.
Ajouter un traitement d’erreurs
Pour anticiper les erreurs dues à des fichiers corrompus ou à des cellules vides, vous pouvez ajouter un traitement des erreurs pour rendre votre code plus robuste.
with open('example.csv', mode='r', encoding='utf-8') as file:
reader = csv.reader(file)
next(reader) # Ignorer l'en-tête
for row in reader:
try:
name = row[0]
age = int(row[1]) # Convertir l'âge en entier
print(f"{name} is {age} years old.")
except (IndexError, ValueError) as e:
print(f"Error processing row: {row}, Error: {e}")
Exemples avancés
- Extraire des données qui répondent à des critères spécifiques (par exemple, âge supérieur à 30 ans).
- Calculer des valeurs à partir des colonnes pour générer de nouvelles informations.
- Calculer des statistiques pour chaque colonne (total, moyenne, etc.).
Dans la section suivante, nous expliquerons comment manipuler les données sous forme de dictionnaire avec csv.DictReader
pour une approche plus intuitive.
Traitement des données ligne par ligne sous forme de dictionnaire avec csv.DictReader
En utilisant csv.DictReader
, chaque ligne du fichier CSV est traitée sous forme de dictionnaire. Cela vous permet de référencer les données par les noms des colonnes, évitant ainsi de devoir mémoriser les indices des colonnes et rendant le code plus lisible.
Utilisation de base de csv.DictReader
Voici un exemple de code qui montre comment traiter les données avec csv.DictReader
:
import csv
with open('example.csv', mode='r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for row in reader:
# Obtenir les valeurs par les noms des colonnes
name = row['Name']
age = row['Age']
city = row['City']
print(f"{name} is {age} years old and lives in {city}.")
Si le fichier CSV est structuré ainsi :
Name,Age,City
Alice,30,New York
Bob,25,Los Angeles
Le résultat de l’exécution sera :
Alice is 30 years old and lives in New York.
Bob is 25 years old and lives in Los Angeles.
Avantages de l’utilisation des noms de colonnes
- Amélioration de la lisibilité du code : Il n’est plus nécessaire de mémoriser les indices des colonnes, vous pouvez directement utiliser les noms des colonnes, ce qui rend le code plus intuitif.
- Flexibilité : Même si l’ordre des colonnes change, tant que les noms des colonnes sont cohérents, il n’est pas nécessaire de modifier le code.
Détection automatique des noms de colonnes
Le csv.DictReader
utilise automatiquement la première ligne comme en-tête. Il est également possible de spécifier des noms de colonnes personnalisés :
with open('example.csv', mode='r', encoding='utf-8') as file:
reader = csv.DictReader(file, fieldnames=['Name', 'Age', 'City']) # Définir des noms de colonnes personnalisés
next(reader) # Passer la première ligne si nécessaire
for row in reader:
print(row)
Traitement des données manquantes
Lorsque des données sont manquantes dans un fichier CSV, la valeur correspondante pour la clé sera None
. Il est important de vérifier et de gérer ces valeurs pour éviter les erreurs.
with open('example.csv', mode='r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for row in reader:
name = row.get('Name', 'Unknown') # Valeur par défaut
age = row.get('Age', 'N/A')
print(f"Name: {name}, Age: {age}")
Exemples d’application
- Filtrage des données : Sélectionner les lignes qui correspondent à un critère spécifique.
- Conversion en JSON : Convertir les données du dictionnaire directement en JSON.
- Traitement statistique : Réaliser des agrégations basées sur les noms des colonnes.
La section suivante traite des considérations importantes concernant l’encodage des fichiers CSV.
Considérations sur l’encodage des fichiers CSV
Lors du traitement des fichiers CSV en Python, l’encodage est un élément crucial. Si l’encodage n’est pas correctement spécifié, il peut y avoir des problèmes de corruption de texte ou d’échec de lecture du fichier. Dans cette section, nous discuterons des types d’encodage courants et de la façon de les gérer correctement.
Types d’encodage fréquemment utilisés
Voici les formats d’encodage couramment utilisés pour les fichiers CSV :
- UTF-8 : Utilisé internationalement et compatible avec plusieurs langues. C’est l’encodage standard en Python.
- Shift_JIS : Utilisé couramment au Japon, mais peut poser des problèmes avec certains caractères spéciaux.
- ISO-8859-1 : Utilisé pour les langues d’Europe occidentale.
Comment spécifier l’encodage
Lors de l’utilisation de la fonction open
en Python, vous pouvez spécifier l’encodage avec l’argument encoding
.
with open('example.csv', mode='r', encoding='utf-8') as file:
print(file.read())
Si le fichier est encodé en Shift_JIS
, vous pouvez spécifier l’encodage comme suit :
with open('example.csv', mode='r', encoding='shift_jis') as file:
print(file.read())
Gestion des erreurs d’encodage
Si une erreur d’encodage se produit, vous pouvez utiliser l’argument errors
pour contrôler le comportement du programme en cas d’erreur.
Ignorer ou remplacer les erreurs
En spécifiant errors
dans la fonction open
, vous pouvez ignorer ou remplacer les caractères incorrects lors de la lecture du fichier.
with open('example.csv', mode='r', encoding='utf-8', errors='ignore') as file:
print(file.read()) # Ignorer les erreurs
with open('example.csv', mode='r', encoding='utf-8', errors='replace') as file:
print(file.read()) # Remplacer les caractères invalides
Détection automatique de l’encodage
Si l’encodage du fichier est inconnu, des bibliothèques comme chardet
ou charset-normalizer
peuvent être utilisées pour détecter l’encodage.
import chardet
# Détecter l'encodage
with open('example.csv', mode='rb') as file:
result = chardet.detect(file.read())
print(result['encoding'])
Conseils pour une gestion efficace de l’encodage
- Vérification préalable : Vérifiez l’encodage du fichier CSV et spécifiez le format approprié.
- Standardisation : Utilisez UTF-8 autant que possible pour garantir une compatibilité optimale.
- Gestion des erreurs : Utilisez les arguments
errors
ou des bibliothèques pour anticiper les erreurs imprévues.
Dans la section suivante, nous discuterons des méthodes efficaces pour traiter de grands fichiers CSV.
Comment traiter efficacement de grands fichiers CSV
Lorsque vous travaillez avec de très gros fichiers CSV, il est important d’adopter des méthodes efficaces pour éviter des problèmes de mémoire ou une lenteur excessive. Python propose plusieurs techniques pour traiter ces fichiers volumineux.
Économie de mémoire en lisant ligne par ligne
Avec csv.reader
ou csv.DictReader
, vous pouvez lire les fichiers CSV ligne par ligne. Cela permet de traiter le fichier sans charger l’ensemble du contenu en mémoire, minimisant ainsi l’empreinte mémoire.
import csv
with open('large_file.csv', mode='r', encoding='utf-8') as file:
reader = csv.reader(file)
for row in reader:
# Traiter chaque ligne
print(row)
Cette méthode fonctionne indépendamment de la taille du fichier, car elle lit les lignes une à une.
Utilisation du traitement par lots
Pour améliorer l’efficacité, vous pouvez diviser un grand fichier CSV et traiter un certain nombre de lignes à la fois. Voici un exemple en utilisant itertools.islice
:
import csv
from itertools import islice
with open('large_file.csv', mode='r', encoding='utf-8') as file:
reader = csv.reader(file)
while True:
batch = list(islice(reader, 100)) # Lire 100 lignes à la fois
if not batch:
break
# Effectuer le traitement par lots
for row in batch:
print(row)
Traitement par morceaux avec Pandas
La bibliothèque Python pandas
est idéale pour traiter de grands ensembles de données. Vous pouvez utiliser l’argument chunk_size
pour effectuer un traitement par morceaux.
import pandas as pd
for chunk in pd.read_csv('large_file.csv', chunksize=1000, encoding='utf-8'):
# Traiter chaque morceau
print(chunk)
Cette méthode est utile lorsque vous souhaitez analyser de grandes quantités de données de manière plus efficace.
Exploitation du traitement parallèle
En divisant le fichier et en traitant les morceaux en parallèle, vous pouvez améliorer considérablement la vitesse de traitement. Voici un exemple en utilisant le module multiprocessing
:
import csv
from multiprocessing import Pool
def process_chunk(chunk):
for row in chunk:
print(row)
def split_file(filename, chunk_size=1000):
with open(filename, mode='r', encoding='utf-8') as file:
reader = csv.reader(file)
batch = []
for i, row in enumerate(reader):
batch.append(row)
if (i + 1) % chunk_size == 0:
yield batch
batch = []
if batch:
yield batch
if __name__ == "__main__":
filename = 'large_file.csv'
with Pool(4) as pool: # Traitement parallèle avec 4 processus
pool.map(process_chunk, split_file(filename))
Choisir un format de données efficace
Bien que le format CSV soit simple et pratique, si les données sont très volumineuses, il peut être judicieux d’explorer d’autres formats (comme Parquet ou Feather), qui peuvent offrir de meilleures performances en termes de vitesse de lecture et de compression.
Exemple pratique : Filtrer et sauvegarder les données
Voici un exemple de filtrage des données d’un grand fichier CSV en fonction de critères spécifiques, puis de sauvegarde dans un fichier séparé :
import csv
with open('large_file.csv', mode='r', encoding='utf-8') as infile, \
open('filtered_file.csv', mode='w', encoding='utf-8', newline='') as outfile:
reader = csv.reader(infile)
writer = csv.writer(outfile)
for row in reader:
if int(row[1]) > 50: # Condition : Valeur de la 2e colonne supérieure à 50
writer.writerow(row)
Nous allons maintenant explorer l’utilisation sécurisée des fichiers avec la déclaration with
.
Manipulation sécurisée des fichiers avec la déclaration with
En utilisant la déclaration with
, vous pouvez facilement gérer l’ouverture et la fermeture des fichiers sans avoir à vous soucier des erreurs ou des fuites de ressources. Cela simplifie la gestion des fichiers, notamment pour les fichiers CSV.
Exemple de base avec la déclaration with
Voici un exemple de code de base utilisant la déclaration with
pour lire un fichier CSV :
import csv
with open('example.csv', mode='r', encoding='utf-8') as file:
reader = csv.reader(file)
for row in reader:
print(row)
Lorsque vous quittez le bloc de la déclaration with
, l’objet file
est automatiquement fermé. Il n’est pas nécessaire d’appeler explicitement la méthode close()
, ce qui simplifie le code.
Exemple de manipulation sécurisée de fichiers lors de l’écriture
Voici un exemple de sécurité lors de l’écriture dans un fichier CSV en utilisant with
:
import csv
data = [
['Name', 'Age', 'City'],
['Alice', '30', 'New York'],
['Bob', '25', 'Los Angeles']
]
with open('output.csv', mode='w', encoding='utf-8', newline='') as file:
writer = csv.writer(file)
writer.writerows(data)
Avantages de la déclaration with
- Simplification de la gestion des ressources
La déclarationwith
garantit que les fichiers sont automatiquement fermés, même en cas d’erreur. - Amélioration de la lisibilité du code
Il n’est pas nécessaire d’inclure des appels explicites àclose()
, ce qui rend le code plus simple et plus facile à comprendre. - Prévention des erreurs
L’utilisation dewith
empêche les fuites de ressources, comme l’oubli de fermer un fichier.
Manipulation sécurisée de plusieurs fichiers simultanément
Il est également possible d’ouvrir et de manipuler plusieurs fichiers simultanément en utilisant la déclaration with
:
import csv
with open('input.csv', mode='r', encoding='utf-8') as infile, \
open('output.csv', mode='w', encoding='utf-8', newline='') as outfile:
reader = csv.reader(infile)
writer = csv.writer(outfile)
for row in reader:
writer.writerow(row)
Risque en l’absence de la déclaration with
Voici un exemple où la déclaration with
est omise :
file = open('example.csv', mode='r', encoding='utf-8')
reader = csv.reader(file)
for row in reader:
print(row)
file.close()
Dans cet exemple, si l’appel à close()
est oublié ou si une erreur se produit, le fichier ne sera pas correctement fermé, ce qui pourrait entraîner des fuites de ressources. Ce problème peut être critique dans des environnements de production ou pour des applications à grande échelle.
Exemple pratique : Filtrage et sauvegarde des données
Dans l’exemple suivant, nous filtrons les données d’un fichier CSV pour ne conserver que celles qui correspondent à un critère particulier, puis nous les enregistrons dans un nouveau fichier :
import csv
with open('input.csv', mode='r', encoding='utf-8') as infile, \
open('filtered_output.csv', mode='w', encoding='utf-8', newline='') as outfile:
reader = csv.reader(infile)
writer = csv.writer(outfile)
for row in reader:
if row[1] == '30': # Condition : La 2e colonne doit être égale à '30'
writer.writerow(row)
Dans cette section, nous allons explorer comment extraire des colonnes spécifiques d’un fichier CSV et les enregistrer dans un nouveau fichier.
Exemple pratique : Extraction et sauvegarde de colonnes spécifiques d’un fichier CSV
Il est fréquent de devoir extraire certaines colonnes d’un fichier CSV et les enregistrer dans un nouveau fichier. Voici comment procéder de manière simple et efficace avec le module csv
de Python.
Exemple de base pour extraire et sauvegarder des colonnes spécifiques
Voici un exemple de code qui extrait les colonnes spécifiques (par exemple, nom et âge) et les sauvegarde dans un nouveau fichier :
import csv
# Chemins des fichiers d'entrée et de sortie
input_file = 'input.csv'
output_file = 'output.csv'
with open(input_file, mode='r', encoding='utf-8') as infile, \
open(output_file, mode='w', encoding='utf-8', newline='') as outfile:
reader = csv.reader(infile)
writer = csv.writer(outfile)
# Traitement de l'en-tête (extraction de colonnes spécifiques)
header = next(reader)
selected_columns = [0, 1] # Colonnes à extraire (ex: 1ère et 2e colonnes)
writer.writerow([header[i] for i in selected_columns])
# Extraire et écrire les colonnes spécifiques pour chaque ligne
for row in reader:
writer.writerow([row[i] for i in selected_columns])
Exemple : Contenu du fichier d’entrée
Voici un exemple du fichier d’entrée input.csv
:
Name,Age,City,Country
Alice,30,New York,USA
Bob,25,Los Angeles,USA
Charlie,35,London,UK
Après exécution du code, le fichier de sortie output.csv
contiendra :
Name,Age
Alice,30
Bob,25
Charlie,35
Extraction dynamique des colonnes
Vous pouvez également spécifier dynamiquement les colonnes à extraire en utilisant les noms des colonnes. Cela permet d’éviter de dépendre des indices.
with open(input_file, mode='r', encoding='utf-8') as infile, \
open(output_file, mode='w', encoding='utf-8', newline='') as outfile:
reader = csv.DictReader(infile)
writer = csv.writer(outfile)
# Colonnes à extraire
columns_to_extract = ['Name', 'City']
writer.writerow(columns_to_extract)
# Extraire et écrire les colonnes spécifiées
for row in reader:
writer.writerow([row[col] for col in columns_to_extract])
Extraction conditionnelle des colonnes
Vous pouvez également extraire uniquement les données qui satisfont à des conditions spécifiques :
with open(input_file, mode='r', encoding='utf-8') as infile, \
open(output_file, mode='w', encoding='utf-8', newline='') as outfile:
reader = csv.DictReader(infile)
writer = csv.DictWriter(outfile, fieldnames=['Name', 'City'])
writer.writeheader()
for row in reader:
if int(row['Age']) > 30: # Extraction de données où l'âge est supérieur à 30
writer.writerow({'Name': row['Name'], 'City': row['City']})
Le fichier de sortie contiendra :
Name,City
Charlie,London
Exemples d’application
- Analyse de données : Extraire des données spécifiques pour les préparer à des calculs ou analyses.
- Transformation des données : Extraire des données nécessaires et les convertir dans un autre format.
- Création de rapports efficaces : Extraire des informations importantes de grands ensembles de données pour créer des rapports simples.
La section suivante résume les points clés abordés dans cet article.
Résumé
Dans cet article, nous avons exploré comment traiter efficacement les fichiers CSV avec Python. Nous avons couvert l’itération de base avec csv.reader
, l’utilisation de csv.DictReader
pour manipuler les données sous forme de dictionnaire, l’extraction de colonnes spécifiques, et les méthodes de traitement de gros fichiers. Nous avons également discuté de la gestion de l’encodage et de l’utilisation de la déclaration with
pour une gestion sécurisée des fichiers.
Avec ces compétences, vous pourrez améliorer vos processus d’analyse de données, d’ETL (Extraction, Transformation, Load), et bien plus encore. Profitez de la flexibilité de Python pour traiter vos données CSV de manière efficace.