Lecture et écriture de fichiers CSV en Python

Lecture et écriture de fichiers CSV en Python

Regardons les choses en face: vous devez obtenir des informations dans et hors de vos programmes via plus que le clavier et la console. L'échange d'informations via des fichiers texte est un moyen courant de partager des informations entre les programmes. L'un des formats les plus populaires pour l'échange de données est le format CSV. Mais comment l'utilisez-vous?

Soyons clairs: vous n'êtes pas obligé (et vous ne le ferez pas) de créer votre propre analyseur CSV à partir de zéro. Il existe plusieurs bibliothèques parfaitement acceptables que vous pouvez utiliser. Le Pythoncsv library fonctionnera dans la plupart des cas. Si votre travail nécessite beaucoup de données ou une analyse numérique, lepandas library dispose également de capacités d'analyse CSV, qui devraient gérer le reste.

Dans cet article, vous apprendrez à lire, traiter et analyser CSV à partir de fichiers texte à l'aide de Python. Vous verrez comment fonctionnent les fichiers CSV, découvrirez la bibliothèquecsv très importante intégrée à Python et comment l’analyse CSV fonctionne à l’aide de la bibliothèquepandas.

Alors, commençons!

__ Take the Quiz: Testez vos connaissances avec notre quiz interactif «Lire et écrire des fichiers CSV en Python». À la fin, vous recevrez un score afin que vous puissiez suivre vos progrès d'apprentissage au fil du temps:

Qu'est-ce qu'un fichier CSV?

Un fichier CSV (fichier de valeurs séparées par des virgules) est un type de fichier en texte brut qui utilise une structure spécifique pour organiser les données tabulaires. Comme il s’agit d’un fichier texte brut, il ne peut contenir que des données texte réelles, c’est-à-dire des caractèresASCII ouUnicode imprimables.

La structure d'un fichier CSV est donnée par son nom. Normalement, les fichiers CSV utilisent une virgule pour séparer chaque valeur de données spécifique. Voici à quoi ressemble cette structure:

column 1 name,column 2 name, column 3 name
first row data 1,first row data 2,first row data 3
second row data 1,second row data 2,second row data 3
...

Remarquez comment chaque élément de données est séparé par une virgule. Normalement, la première ligne identifie chaque élément de données, en d'autres termes, le nom d'une colonne de données. Toutes les lignes suivantes sont des données réelles et ne sont limitées que par des contraintes de taille de fichier.

En général, le caractère séparateur est appelé un délimiteur et la virgule n'est pas la seule utilisée. D'autres délimiteurs populaires incluent les caractères tabulation ( ), deux-points (:) et point-virgule (;). Pour analyser correctement un fichier CSV, nous devons savoir quel délimiteur est utilisé.

D'où proviennent les fichiers CSV?

Les fichiers CSV sont normalement créés par des programmes qui gèrent de grandes quantités de données. Ils constituent un moyen pratique d'exporter des données à partir de feuilles de calcul et de bases de données ainsi que de les importer ou de les utiliser dans d'autres programmes. Par exemple, vous pouvez exporter les résultats d'un programme d'exploration de données dans un fichier CSV, puis l'importer dans une feuille de calcul pour analyser les données, générer des graphiques pour une présentation ou préparer un rapport pour publication.

Les fichiers CSV sont très faciles à utiliser par programme. Toute langue prenant en charge la saisie de fichiers texte et la manipulation de chaînes (comme Python) peut fonctionner directement avec les fichiers CSV.

Analyse des fichiers CSV avec la bibliothèque CSV intégrée de Python

Lecsv library fournit des fonctionnalités de lecture et d'écriture dans des fichiers CSV. Conçu pour fonctionner immédiatement avec des fichiers CSV générés par Excel, il est facilement adapté pour fonctionner avec une variété de formats CSV. La bibliothèquecsv contient des objets et d'autres codes pour lire, écrire et traiter des données depuis et vers des fichiers CSV.

Lecture de fichiers CSV aveccsv

La lecture à partir d'un fichier CSV se fait à l'aide de l'objetreader. Le fichier CSV est ouvert en tant que fichier texte avec la fonctionopen() intégrée de Python, qui renvoie un objet fichier. Ceci est ensuite passé aureader, qui fait le gros du travail.

Voici le fichieremployee_birthday.txt:

name,department,birthday month
John Smith,Accounting,November
Erica Meyers,IT,March

Voici le code pour le lire:

import csv

with open('employee_birthday.txt') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    line_count = 0
    for row in csv_reader:
        if line_count == 0:
            print(f'Column names are {", ".join(row)}')
            line_count += 1
        else:
            print(f'\t{row[0]} works in the {row[1]} department, and was born in {row[2]}.')
            line_count += 1
    print(f'Processed {line_count} lines.')

Il en résulte la sortie suivante:

Column names are name, department, birthday month
    John Smith works in the Accounting department, and was born in November.
    Erica Meyers works in the IT department, and was born in March.
Processed 3 lines.

Chaque ligne renvoyée par lesreader est une liste d'élémentsString contenant les données trouvées en supprimant les délimiteurs. La première ligne renvoyée contient les noms de colonne, qui sont traités d'une manière spéciale.

Lecture de fichiers CSV dans un dictionnaire aveccsv

Plutôt que de traiter une liste d'éléments individuelsString, vous pouvez lire les données CSV directement dans un dictionnaire (techniquement, également unOrdered Dictionary).

Encore une fois, notre fichier d'entrée,employee_birthday.txt est le suivant:

name,department,birthday month
John Smith,Accounting,November
Erica Meyers,IT,March

Voici le code pour le lire dans un dictionnaire cette fois:

import csv

with open('employee_birthday.txt', mode='r') as csv_file:
    csv_reader = csv.DictReader(csv_file)
    line_count = 0
    for row in csv_reader:
        if line_count == 0:
            print(f'Column names are {", ".join(row)}')
            line_count += 1
        print(f'\t{row["name"]} works in the {row["department"]} department, and was born in {row["birthday month"]}.')
        line_count += 1
    print(f'Processed {line_count} lines.')

Il en résulte la même sortie que précédemment:

Column names are name, department, birthday month
    John Smith works in the Accounting department, and was born in November.
    Erica Meyers works in the IT department, and was born in March.
Processed 3 lines.

D'où viennent les clés du dictionnaire? La première ligne du fichier CSV est supposée contenir les clés à utiliser pour créer le dictionnaire. Si vous ne les avez pas dans votre fichier CSV, vous devez spécifier vos propres clés en définissant le paramètre facultatiffieldnames sur une liste les contenant.

Paramètres Python CSVreaderfacultatifs

L'objetreader peut gérer différents styles de fichiers CSV en spécifiantadditional parameters, dont certains sont illustrés ci-dessous:

  • delimiter spécifie le caractère utilisé pour séparer chaque champ. La valeur par défaut est la virgule (',').

  • quotechar spécifie le caractère utilisé pour entourer les champs contenant le caractère délimiteur. La valeur par défaut est un guillemet double (' " ').

  • escapechar spécifie le caractère utilisé pour échapper le caractère délimiteur, au cas où les guillemets ne seraient pas utilisés. La valeur par défaut est aucun caractère d'échappement.

Ces paramètres méritent des explications supplémentaires. Supposons que vous travaillez avec le fichieremployee_addresses.txt suivant:

name,address,date joined
john smith,1132 Anywhere Lane Hoboken NJ, 07030,Jan 4
erica meyers,1234 Smith Lane Hoboken NJ, 07030,March 2

Ce fichier CSV contient trois champs:name,address etdate joined, qui sont délimités par des virgules. Le problème est que les données du champaddress contiennent également une virgule pour indiquer le code postal.

Il existe trois façons différentes de gérer cette situation:

  • Use a different delimiter
    De cette façon, la virgule peut être utilisée en toute sécurité dans les données elles-mêmes. Vous utilisez le paramètre facultatifdelimiter pour spécifier le nouveau délimiteur.

  • Wrap the data in quotes
    La nature spéciale du délimiteur choisi est ignorée dans les chaînes entre guillemets. Par conséquent, vous pouvez spécifier le caractère utilisé pour les guillemets avec le paramètre facultatifquotechar. Tant que ce caractère n'apparaît pas non plus dans les données, tout va bien.

  • Escape the delimiter characters in the data
    Les caractères d'échappement fonctionnent comme ils le font dans les chaînes de format, annulant l'interprétation du caractère échappé (dans ce cas, le délimiteur). Si un caractère d'échappement est utilisé, il doit être spécifié à l'aide du paramètre facultatifescapechar.

Écriture de fichiers CSV aveccsv

Vous pouvez également écrire dans un fichier CSV en utilisant un objetwriter et la méthode.write_row():

import csv

with open('employee_file.csv', mode='w') as employee_file:
    employee_writer = csv.writer(employee_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)

    employee_writer.writerow(['John Smith', 'Accounting', 'November'])
    employee_writer.writerow(['Erica Meyers', 'IT', 'March'])

Le paramètre optionnelquotechar indique auwriter quel caractère utiliser pour citer les champs lors de l'écriture. Cependant, si la citation est utilisée ou non, est déterminée par le paramètre facultatifquoting:

  • Siquoting est défini surcsv.QUOTE_MINIMAL, alors.writerow() ne citera les champs que s'ils contiennent lesdelimiter ou lesquotechar. C'est le cas par défaut.

  • Siquoting est défini surcsv.QUOTE_ALL, alors.writerow() citera tous les champs.

  • Siquoting est défini surcsv.QUOTE_NONNUMERIC, alors.writerow() citera tous les champs contenant des données texte et convertira tous les champs numériques au type de donnéesfloat.

  • Siquoting est défini surcsv.QUOTE_NONE, alors.writerow() échappera aux délimiteurs au lieu de les citer. Dans ce cas, vous devez également fournir une valeur pour le paramètre facultatifescapechar.

La lecture du fichier en texte brut montre que le fichier est créé comme suit:

John Smith,Accounting,November
Erica Meyers,IT,March

Écriture d'un fichier CSV à partir d'un dictionnaire aveccsv

Comme vous pouvez lire nos données dans un dictionnaire, il est juste que vous puissiez également les écrire à partir d'un dictionnaire:

import csv

with open('employee_file2.csv', mode='w') as csv_file:
    fieldnames = ['emp_name', 'dept', 'birth_month']
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames)

    writer.writeheader()
    writer.writerow({'emp_name': 'John Smith', 'dept': 'Accounting', 'birth_month': 'November'})
    writer.writerow({'emp_name': 'Erica Meyers', 'dept': 'IT', 'birth_month': 'March'})

Contrairement àDictReader, le paramètrefieldnames est requis lors de l'écriture d'un dictionnaire. Cela a du sens, quand on y pense: sans une liste defieldnames, lesDictWriter ne peuvent pas savoir quelles clés utiliser pour récupérer les valeurs de vos dictionnaires. Il utilise également les clés defieldnames pour écrire la première ligne sous forme de noms de colonne.

Le code ci-dessus génère le fichier de sortie suivant:

emp_name,dept,birth_month
John Smith,Accounting,November
Erica Meyers,IT,March

Analyse des fichiers CSV avec la bibliothèquepandas

Bien sûr, la bibliothèque Python CSV n'est pas le seul jeu en ville. La lecture des fichiers CSV est également possible danspandas. Il est fortement recommandé si vous avez beaucoup de données à analyser.

pandas est une bibliothèque Python open source qui fournit des outils d'analyse de données hautes performances et des structures de données faciles à utiliser. pandas est disponible pour toutes les installations Python, mais c'est un élément clé de la distribution deAnaconda et fonctionne extrêmement bien dansJupyter notebooks pour partager des données, du code, des résultats d'analyse, des visualisations et du texte narratif .

L'installation depandas et de ses dépendances dansAnaconda se fait facilement:

$ conda install pandas

Tout comme l'utilisation depip/pipenv pour d'autres installations Python:

$ pip install pandas

Nous n'entrerons pas dans les détails du fonctionnement depandas ou de son utilisation. Pour un traitement en profondeur sur l'utilisation depandas pour lire et analyser de grands ensembles de données, consultez le superbe article deShantnu Tiwari’s surworking with large Excel files in pandas.

Lecture de fichiers CSV avecpandas

Pour montrer une partie de la puissance des capacités CSV depandas, j'ai créé un fichier légèrement plus compliqué à lire, appeléhrdata.csv. Il contient des données sur les employés de l'entreprise:

Name,Hire Date,Salary,Sick Days remaining
Graham Chapman,03/15/14,50000.00,10
John Cleese,06/01/15,65000.00,8
Eric Idle,05/12/14,45000.00,10
Terry Jones,11/01/13,70000.00,3
Terry Gilliam,08/12/14,48000.00,7
Michael Palin,05/23/13,66000.00,8

La lecture du CSV dans unpandasDataFrame est rapide et simple:

import pandas
df = pandas.read_csv('hrdata.csv')
print(df)

C'est tout: trois lignes de code, et une seule d'entre elles fait le travail réel. pandas.read_csv() ouvre, analyse et lit le fichier CSV fourni et stocke les données dans unDataFrame. L'impression desDataFrame entraîne la sortie suivante:

             Name Hire Date   Salary  Sick Days remaining
0  Graham Chapman  03/15/14  50000.0                   10
1     John Cleese  06/01/15  65000.0                    8
2       Eric Idle  05/12/14  45000.0                   10
3     Terry Jones  11/01/13  70000.0                    3
4   Terry Gilliam  08/12/14  48000.0                    7
5   Michael Palin  05/23/13  66000.0                    8

Voici quelques points à noter:

  • Tout d'abord,pandas a reconnu que la première ligne du CSV contenait des noms de colonnes et les a utilisées automatiquement. J'appelle cela la bonté.

  • Cependant,pandas utilise également des indices entiers de base zéro dans lesDataFrame. C'est parce que nous ne lui avons pas dit quel devrait être notre indice.

  • De plus, si vous regardez les types de données de nos colonnes, vous verrez quepandas a correctement converti les colonnesSalary etSick Days remaining en nombres, mais la colonneHire Date est toujours unString. Ceci est facilement confirmé en mode interactif:

    >>>

>>> print(type(df['Hire Date'][0]))

Abordons ces problèmes un par un. Pour utiliser une colonne différente comme indexDataFrame, ajoutez le paramètre facultatifindex_col:

import pandas
df = pandas.read_csv('hrdata.csv', index_col='Name')
print(df)

Maintenant, le champName est notre indexDataFrame:

               Hire Date   Salary  Sick Days remaining
Name
Graham Chapman  03/15/14  50000.0                   10
John Cleese     06/01/15  65000.0                    8
Eric Idle       05/12/14  45000.0                   10
Terry Jones     11/01/13  70000.0                    3
Terry Gilliam   08/12/14  48000.0                    7
Michael Palin   05/23/13  66000.0                    8

Ensuite, corrigeons le type de données du champHire Date. Vous pouvez forcerpandas à lire les données en tant que date avec le paramètre facultatifparse_dates, qui est défini comme une liste de noms de colonnes à traiter comme des dates:

import pandas
df = pandas.read_csv('hrdata.csv', index_col='Name', parse_dates=['Hire Date'])
print(df)

Remarquez la différence de sortie:

                Hire Date   Salary  Sick Days remaining
Name
Graham Chapman 2014-03-15  50000.0                   10
John Cleese    2015-06-01  65000.0                    8
Eric Idle      2014-05-12  45000.0                   10
Terry Jones    2013-11-01  70000.0                    3
Terry Gilliam  2014-08-12  48000.0                    7
Michael Palin  2013-05-23  66000.0                    8

La date est maintenant formatée correctement, ce qui se confirme facilement en mode interactif:

>>>

>>> print(type(df['Hire Date'][0]))

Si vos fichiers CSV ne comportent pas de noms de colonnes sur la première ligne, vous pouvez utiliser le paramètre facultatifnames pour fournir une liste de noms de colonnes. Vous pouvez également l'utiliser si vous souhaitez remplacer les noms de colonne fournis dans la première ligne. Dans ce cas, vous devez également dire àpandas.read_csv() d'ignorer les noms de colonnes existants à l'aide du paramètre facultatifheader=0:

import pandas
df = pandas.read_csv('hrdata.csv',
            index_col='Employee',
            parse_dates=['Hired'],
            header=0,
            names=['Employee', 'Hired','Salary', 'Sick Days'])
print(df)

Notez que, puisque les noms de colonne ont changé, les colonnes spécifiées dans les paramètres facultatifsindex_col etparse_dates doivent également être modifiées. Cela se traduit maintenant par la sortie suivante:

                    Hired   Salary  Sick Days
Employee
Graham Chapman 2014-03-15  50000.0         10
John Cleese    2015-06-01  65000.0          8
Eric Idle      2014-05-12  45000.0         10
Terry Jones    2013-11-01  70000.0          3
Terry Gilliam  2014-08-12  48000.0          7
Michael Palin  2013-05-23  66000.0          8

Écriture de fichiers CSV avecpandas

Bien sûr, si vous ne parvenez pas à extraire à nouveau vos données depandas, cela ne vous fera pas grand-chose. Écrire unDataFrame dans un fichier CSV est tout aussi simple que d'en lire un. Écrivons les données avec les nouveaux noms de colonne dans un nouveau fichier CSV:

import pandas
df = pandas.read_csv('hrdata.csv',
            index_col='Employee',
            parse_dates=['Hired'],
            header=0,
            names=['Employee', 'Hired', 'Salary', 'Sick Days'])
df.to_csv('hrdata_modified.csv')

La seule différence entre ce code et le code de lecture ci-dessus est que l'appelprint(df) a été remplacé pardf.to_csv(), fournissant le nom du fichier. Le nouveau fichier CSV ressemble à ceci:

Employee,Hired,Salary,Sick Days
Graham Chapman,2014-03-15,50000.0,10
John Cleese,2015-06-01,65000.0,8
Eric Idle,2014-05-12,45000.0,10
Terry Jones,2013-11-01,70000.0,3
Terry Gilliam,2014-08-12,48000.0,7
Michael Palin,2013-05-23,66000.0,8

Conclusion

Si vous comprenez les bases de la lecture de fichiers CSV, vous ne serez jamais pris au dépourvu lorsque vous devrez gérer l’importation de données. La plupart des tâches de lecture, de traitement et d'écriture CSV peuvent être facilement gérées par la bibliothèque Python de base decsv. Si vous avez beaucoup de données à lire et à traiter, la bibliothèquepandas offre également des capacités de gestion CSV rapides et faciles.

__ Take the Quiz: Testez vos connaissances avec notre quiz interactif «Lire et écrire des fichiers CSV en Python». À la fin, vous recevrez un score afin que vous puissiez suivre vos progrès d'apprentissage au fil du temps:

Existe-t-il d'autres façons d'analyser des fichiers texte? Bien sûr! Les bibliothèques commeANTLR,PLY etPlyPlus peuvent toutes gérer une analyse intensive, et si une simple manipulation deStringne fonctionne pas, il y a toujours des expressions régulières.

Mais ce sont des sujets pour d'autres articles…