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 CSVreader
facultatifs
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
:
-
Si
quoting
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. -
Si
quoting
est défini surcsv.QUOTE_ALL
, alors.writerow()
citera tous les champs. -
Si
quoting
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
. -
Si
quoting
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 unpandas
DataFrame
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 que
pandas
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 deString
ne fonctionne pas, il y a toujours des expressions régulières.
Mais ce sont des sujets pour d'autres articles…