Persistance des données Python - Module CSV

CSV stands for comma separated values. Ce format de fichier est un format de données couramment utilisé lors de l'exportation / importation de données vers / depuis des feuilles de calcul et des tables de données dans des bases de données. Le module csv a été incorporé dans la bibliothèque standard de Python suite à PEP 305. Il présente des classes et des méthodes pour effectuer des opérations de lecture / écriture sur un fichier CSV conformément aux recommandations de PEP 305.

CSV est un format de données d'exportation préféré par le logiciel de feuille de calcul Excel de Microsoft. Cependant, le module csv peut également gérer les données représentées par d'autres dialectes.

L'interface API CSV comprend les classes d'écrivain et de lecteur suivantes:

écrivain()

Cette fonction du module csv renvoie un objet écrivain qui convertit les données en une chaîne délimitée et les stocke dans un objet fichier. La fonction a besoin d'un objet fichier avec autorisation d'écriture comme paramètre. Chaque ligne écrite dans le fichier émet un caractère de nouvelle ligne. Pour éviter tout espace supplémentaire entre les lignes, le paramètre de nouvelle ligne est défini sur «».

La classe écrivain a les méthodes suivantes -

écrivainow ()

Cette méthode écrit les éléments dans un itérable (liste, tuple ou chaîne), en les séparant par une virgule.

écrivain ()

Cette méthode prend une liste d'itérables, comme paramètre et écrit chaque élément sous la forme d'une ligne d'éléments séparés par des virgules dans le fichier.

Example

L'exemple suivant montre l'utilisation de la fonction writer (). Tout d'abord, un fichier est ouvert en mode «w». Ce fichier est utilisé pour obtenir un objet écrivain. Chaque tuple de la liste des tuples est ensuite écrit dans le fichier à l'aide de la méthode writerow ().

import csv
   persons=[('Lata',22,45),('Anil',21,56),('John',20,60)]
   csvfile=open('persons.csv','w', newline='')
   obj=csv.writer(csvfile)
   for person in persons:
      obj.writerow(person)
csvfile.close()

Output

Cela créera le fichier «persons.csv» dans le répertoire courant. Il affichera les données suivantes.

Lata,22,45
Anil,21,56
John,20,60

Au lieu d'itérer sur la liste pour écrire chaque ligne individuellement, nous pouvons utiliser la méthode writerows ().

csvfile=open('persons.csv','w', newline='')
persons=[('Lata',22,45),('Anil',21,56),('John',20,60)]
   obj=csv.writer(csvfile)
   obj.writerows(persons)
   obj.close()

lecteur()

Cette fonction renvoie un objet lecteur qui renvoie un itérateur de lignes dans le csv file. En utilisant la boucle for régulière, toutes les lignes du fichier sont affichées dans l'exemple suivant -

Exemple

csvfile=open('persons.csv','r', newline='')
   obj=csv.reader(csvfile)
   for row in obj:
      print (row)

Production

['Lata', '22', '45']
['Anil', '21', '56']
['John', '20', '60']

L'objet lecteur est un itérateur. Par conséquent, il prend en charge la fonction next () qui peut également être utilisée pour afficher toutes les lignes du fichier csv au lieu d'unfor loop.

csvfile=open('persons.csv','r', newline='')
   obj=csv.reader(csvfile)
   while True:
   try:
      row=next(obj)
      print (row)
   except StopIteration:
      break

Comme mentionné précédemment, le module csv utilise Excel comme dialecte par défaut. Le module csv définit également une classe de dialectes. Dialect est un ensemble de normes utilisées pour implémenter le protocole CSV. La liste des dialectes disponibles peut être obtenue par la fonction list_dialects ().

>>> csv.list_dialects()
['excel', 'excel-tab', 'unix']

En plus des itérables, le module csv peut exporter un objet dictionnaire vers un fichier CSV et le lire pour remplir l'objet dictionnaire Python. A cet effet, ce module définit les classes suivantes -

DictWriter ()

Cette fonction renvoie un objet DictWriter. Il est similaire à l'objet écrivain, mais les lignes sont mappées à l'objet dictionnaire. La fonction a besoin d'un objet fichier avec autorisation d'écriture et d'une liste de clés utilisées dans le dictionnaire comme paramètre fieldnames. Ceci est utilisé pour écrire la première ligne du fichier comme en-tête.

en-tête d'écriture ()

Cette méthode écrit la liste des clés dans le dictionnaire sous la forme d'une ligne séparée par des virgules en tant que première ligne du fichier.

Dans l'exemple suivant, une liste d'éléments de dictionnaire est définie. Chaque élément de la liste est un dictionnaire. En utilisant la méthode writrows (), ils sont écrits dans un fichier séparés par des virgules.

persons=[
   {'name':'Lata', 'age':22, 'marks':45}, 
   {'name':'Anil', 'age':21, 'marks':56}, 
   {'name':'John', 'age':20, 'marks':60}
]
csvfile=open('persons.csv','w', newline='')
fields=list(persons[0].keys())
obj=csv.DictWriter(csvfile, fieldnames=fields)
obj.writeheader()
obj.writerows(persons)
csvfile.close()

Le fichier persons.csv affiche le contenu suivant -

name,age,marks
Lata,22,45
Anil,21,56
John,20,60

DictReader ()

Cette fonction renvoie un objet DictReader à partir du fichier CSV sous-jacent. Comme, dans le cas d'un objet lecteur, celui-ci est également un itérateur, en utilisant quel contenu du fichier est récupéré.

csvfile=open('persons.csv','r', newline='')
obj=csv.DictReader(csvfile)

La classe fournit l'attribut fieldnames, renvoyant les clés de dictionnaire utilisées comme en-tête du fichier.

print (obj.fieldnames)
['name', 'age', 'marks']

Utilisez une boucle sur l'objet DictReader pour récupérer des objets de dictionnaire individuels.

for row in obj:
   print (row)

Cela entraîne la sortie suivante -

OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
OrderedDict([('name', 'Anil'), ('age', '21'), ('marks', '56')])
OrderedDict([('name', 'John'), ('age', '20'), ('marks', '60')])

Pour convertir l'objet OrderedDict en dictionnaire normal, nous devons d'abord importer OrderedDict à partir du module de collections.

from collections import OrderedDict
   r=OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
   dict(r)
{'name': 'Lata', 'age': '22', 'marks': '45'}