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:
-
delimiterspécifie le caractère utilisé pour séparer chaque champ. La valeur par défaut est la virgule (','). -
quotecharspécifie le caractère utilisé pour entourer les champs contenant le caractère délimiteur. La valeur par défaut est un guillemet double (' " '). -
escapecharspé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 facultatifdelimiterpour 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
quotingest défini surcsv.QUOTE_MINIMAL, alors.writerow()ne citera les champs que s'ils contiennent lesdelimiterou lesquotechar. C'est le cas par défaut. -
Si
quotingest défini surcsv.QUOTE_ALL, alors.writerow()citera tous les champs. -
Si
quotingest 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
quotingest 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,
pandasa 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,
pandasutilise é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
pandasa correctement converti les colonnesSalaryetSick Days remainingen nombres, mais la colonneHire Dateest 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…