Python >> Tutoriel Python >  >> Python

Comment lire un fichier CSV dans une liste en Python

Lire et traiter des fichiers CSV en Python.

Les fichiers de valeurs séparées par des virgules, ou fichiers CSV, sont le type de fichier le plus populaire pour stocker des données tabulaires. Pourquoi voudriez-vous lire des fichiers CSV en Python ? Peut-être que votre parcours de programmation vous a amené à un point où vous devez travailler avec des fichiers. Ou peut-être souhaitez-vous effectuer des calculs sur les données recueillies à partir d'un capteur IoT.

La façon la plus simple de travailler avec des fichiers CSV en Python est d'utiliser le module pandas. À partir de là, vous pouvez aller plus loin avec vos données et les visualiser.

Mais ce n'est pas le seul moyen. si vous avez des raisons de ne compter que sur des méthodes Pythoniques pures, voici comment !

Lire un fichier CSV dans une liste de listes

Imaginez que vous travaillez avec des données d'examens de classe. Vous avez des noms et des notes, et vous voulez calculer la moyenne de la classe. Pour simplifier, supposons que les notes vont de 1 (la pire) à 6 (la meilleure). Nous avons les données au format ci-dessous, dans un fichier appelé data.csv :

id,student,grade
1,John,4
2,Emily,5
3,Emma,3
...

Qui peut être représenté sous forme de tableau :

idstudentgrade 1John4 2Emily5 3Emma3 ...

Comme vous le voyez, il utilise la virgule comme séparateur et nous avons une ligne d'en-tête. Sachant tout cela, écrivons le code !

>>> import csv
>>> 
>>> file = open("data.csv", "r")
>>> data = list(csv.reader(file, delimiter=","))
>>> file.close()
>>> 
>>> print(data)
[['id', 'student', 'grade'], ['1', 'John', '4'], ['2', 'Emily', '5'], ['3', 'Emma', '3'], ['4', 'Patricia', '5'], ['5', 'James', '2'], ['6', 'Michael', '4'], ['7', 'David', '3'], ['8', 'Linda', '5'], ['9', 'Andrew', '5'], ['10', 'Mary', '6'], ['11', 'Kevin', '6'], ['12', 'Barbara', '1'], ['13', 'George', '1'], ['14', 'Peter', '3'], ['15', 'Zach', '4'], ['16', 'Susan', '4'], ['17', 'Lisa', '4'], ['18', 'Tim', '4.5']]

En gros, c'est ça ! Passons en revue le script ligne par ligne.

Dans la première ligne, nous importons le csv module. Ensuite, nous ouvrons le fichier en mode lecture et attribuons le descripteur de fichier au file variables.

Ensuite, nous travaillons sur le fichier ouvert en utilisant csv.reader() . Nous n'avons qu'à spécifier le premier argument, iterable , et nous spécifions la virgule comme délimiteur. Comme vous l'avez peut-être compris dans le nom du premier argument, il s'attend à recevoir un itérable, vous pouvez donc également transmettre une liste de lignes CSV (sous forme de texte). Lorsque nous passons un descripteur de fichier, csv.reader() le traite comme un itérable et lit le fichier entier ligne par ligne.

csv.reader() renvoie également un itérable. Considérez-le comme une chaîne de données, accessible une par une et une seule fois. Pour comprendre la situation dans son ensemble et devenir plus fluide avec les itérables, consultez l'article "An Introduction to Combinatoric Iterators in Python".

Pour transformer un itérable en liste, nous enveloppons l'expression entière avec list() . Si jamais vous travaillez avec d'énormes quantités de données - ne faites pas cela – vous manquerez probablement de RAM dans votre appareil. Pour devenir un pro Pour gérer d'énormes fichiers CSV, consultez notre cours Comment lire et écrire des fichiers CSV en Python. Dans le cours, vous apprendrez également à créer et à écrire vos propres fichiers CSV.

Enfin, une fois que nous avons lu tout le fichier et que nous n'en avons plus besoin, nous pouvons le fermer en toute sécurité avec file.close() . Notez que vous obtenez une erreur d'E/S si vous décidez de vous en tenir aux itérateurs et essayez de les utiliser après la fermeture.

Calculer la moyenne

Pour calculer la moyenne manuellement, nous avons besoin de deux valeurs :la somme totale de toutes les notes et le nombre de notes. Heureusement, Python est livré avec des fonctions pour ces deux tâches.

Commençons par extraire les notes des données.

>>> [row[2] for row in data]
['grade', '4', '5', '3', '5', '2', '4', '3', '5', '5', '6', '6', '1', '1', '3', '4', '4', '4', '4.5']

Nous avons utilisé ici une construction appelée compréhension de liste. Si vous n'êtes pas familier avec cette syntaxe, Marija a écrit un article à ce sujet, jetez-y un coup d'œil !

Mais nos notes ne sont pas bonnes. Nous avons deux problèmes à résoudre. Tout d'abord, nous avons laissé l'en-tête dans les données. Deuxièmement, nous ne pouvons pas calculer une moyenne de chaînes, nous devons donc les convertir en flottants.

Pour résoudre le premier problème, nous utilisons le découpage d'index et sautons la première ligne. Cela signifie que nous écrivons data[1:] au lieu de simplement data . Ensuite, on enveloppe row[2] avec le float() fonction pour obtenir des nombres avec lesquels nous pouvons travailler.

Nous pouvons également utiliser des cartes et des filtres. Cela semble mystérieux ? Si nous avons réussi à vous intriguer, consultez l'article de Xavier, "Map, Filter, and Reduce - Working on Streams in Python."

Remarque :écrire row[2] n'est pas la plus jolie des solutions. Il est évident que nous obtenons la valeur de la troisième colonne, mais nous y reviendrons plus tard dans l'article pour utiliser les noms de colonne .

>>> [float(row[2]) for row in data[1:]]
[4.0, 5.0, 3.0, 5.0, 2.0, 4.0, 3.0, 5.0, 5.0, 6.0, 6.0, 1.0, 1.0, 3.0, 4.0, 4.0, 4.0, 4.5]

Ahhh oui ! Ça a l'air bien. Attribuons cette expression à la variable notes et calculons les deux valeurs dont nous avons parlé au début de cette section.

>>> sum_grades = sum(grades)
>>> count_grades = len(grades)
>>> grades_avg = sum_grades / count_grades
>>> print("Average:", grades_avg)
Average: 3.861111111111111

Fait! Assez explicite, n'est-ce pas? La première ligne résume toute la liste. La deuxième ligne calcule la longueur de la liste, c'est-à-dire le nombre d'éléments. Et la troisième ligne est une division de base pour obtenir la moyenne.

Lire un fichier CSV dans une liste de dictionnaires

Comme promis précédemment, nous voyons maintenant comment utiliser les noms de colonne de l'en-tête pour accéder aux données. Pour ce faire, nous utilisons csv.DictReader() .

Comme son nom l'indique, il analyse chaque ligne comme un dictionnaire, en utilisant la ligne d'en-tête pour déterminer les noms de colonne. Si vous n'avez pas de ligne d'en-tête, vous pouvez spécifier le fieldnames dispute. Le reste est à peu près pareil. Lisez plus de détails dans la documentation officielle ou apprenez dans notre cours CSV.

Réécrivons le code :

>>> import csv
>>> 
>>> file = open("data.csv", "r")
>>> data = list(csv.DictReader(file, delimiter=","))
>>> file.close()
>>> 
>>> print(data)
[{'id': '1', 'student': 'John', 'grade': '4'}, {'id': '2', 'student': 'Emily', 'grade': '5'}, {'id': '3', 'student': 'Emma', 'grade': '3'}, {'id': '4', 'student': 'Patricia', 'grade': '5'}, {'id': '5', 'student': 'James', 'grade': '2'}, {'id': '6', 'student': 'Michael', 'grade': '4'}, {'id': '7', 'student': 'David', 'grade': '3'}, {'id': '8', 'student': 'Linda', 'grade': '5'}, {'id': '9', 'student': 'Andrew', 'grade': '5'}, {'id': '10', 'student': 'Mary', 'grade': '6'}, {'id': '11', 'student': 'Kevin', 'grade': '6'}, {'id': '12', 'student': 'Barbara', 'grade': '1'}, {'id': '13', 'student': 'George', 'grade': '1'}, {'id': '14', 'student': 'Peter', 'grade': '3'}, {'id': '15', 'student': 'Zach', 'grade': '4'}, {'id': '16', 'student': 'Susan', 'grade': '4'}, {'id': '17', 'student': 'Lisa', 'grade': '4'}, {'id': '18', 'student': 'Tim', 'grade': '4.5'}]

Aussi simple que cela! Maintenant, nous pouvons rendre l'extraction des notes plus jolie :

>>> [float(row["grade"]) for row in data]
[4.0, 5.0, 3.0, 5.0, 2.0, 4.0, 3.0, 5.0, 5.0, 6.0, 6.0, 1.0, 1.0, 3.0, 4.0, 4.0, 4.0, 4.5]

Le code restant - calcul de la moyenne - est le même.

Lisez des fichiers CSV en Python et faites-en plus avec les données !

Super! Python est livré avec une pléthore de modules et de fonctions qui facilitent considérablement ces tâches. Dans cet article, nous avons examiné l'analyse des fichiers CSV en Python. Pour afficher un tableau de vos données, apprenez avec l'article de Luke sur la façon de joli-imprimer - avec juste du Python pur ou avec des modules supplémentaires.

Jetez également un coup d'œil à notre parcours Python pour la science des données à travers des exercices pratiques étape par étape. Commencez à en faire plus avec les données dont vous disposez déjà !