Python: Le module CSV
Testé avec Python 3.5
Le module csv de python permet de lire et d'écrire des fichiers csv très facilement.
Créer un fichier csv:
Exemple avec la liste suivante (cette liste contient 13 sous-listes de 7 valeurs)
>>> pprint(l)
[['root', 'x', '0', '0', 'root', '/root', '/bin/bash'],
['daemon', 'x', '1', '1', 'daemon', '/usr/sbin', '/usr/sbin/nologin'],
['bin', 'x', '2', '2', 'bin', '/bin', '/usr/sbin/nologin'],
['sys', 'x', '3', '3', 'sys', '/dev', '/usr/sbin/nologin'],
['sync', 'x', '4', '65534', 'sync', '/bin', '/bin/sync'],
['games', 'x', '5', '60', 'games', '/usr/games', '/usr/sbin/nologin'],
['man', 'x', '6', '12', 'man', '/var/cache/man', '/usr/sbin/nologin'],
['lp', 'x', '7', '7', 'lp', '/var/spool/lpd', '/usr/sbin/nologin'],
['mail', 'x', '8', '8', 'mail', '/var/mail', '/usr/sbin/nologin'],
['news', 'x', '9', '9', 'news', '/var/spool/news', '/usr/sbin/nologin'],
['uucp', 'x', '10', '10', 'uucp', '/var/spool/uucp', '/usr/sbin/nologin'],
['proxy', 'x', '13', '13', 'proxy', '/bin', '/usr/sbin/nologin'],
['www-data', 'x', '33', '33', 'www-data', '/var/www', '/usr/sbin/nologin']]
>>> import csv
>>> with open('passwd.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerows(l)
Vachement simple, non !
La fonction "writerows" avec un "s" à la fin, permet d'écrire en une seule fois tout le contenu d'une liste contenant elle-même des sous-listes (comme dans l'exemple ci-dessus).
Par contre, pour écrire uniquement le contenu d'une liste, sans sous-liste, il faut utiliser la fonction "writerow" (sans le "s" à la fin).
>>> import csv
>>> with open('passwd.csv', 'w', newline='') as f:
writer = csv.writer(f)
for x in l:
writer.writerow(x)
Lors de l'ouverture du fichier à l'aide de la commande open, il faut obligatoirement indiqué le paramètre newline='' sinon des sauts de lignes supplémentaires seront ajoutés à chaque écriture.
Lire un fichier csv:
>>> import csv
>>> with open('passwd.csv', newline='') as f:
reader = csv.reader(f)
for row in reader:
print(row)
['root', 'x', '0', '0', 'root', '/root', '/bin/bash']
['daemon', 'x', '1', '1', 'daemon', '/usr/sbin', '/usr/sbin/nologin']
['bin', 'x', '2', '2', 'bin', '/bin', '/usr/sbin/nologin']
['sys', 'x', '3', '3', 'sys', '/dev', '/usr/sbin/nologin']
['sync', 'x', '4', '65534', 'sync', '/bin', '/bin/sync']
['games', 'x', '5', '60', 'games', '/usr/games', '/usr/sbin/nologin']
['man', 'x', '6', '12', 'man', '/var/cache/man', '/usr/sbin/nologin']
['lp', 'x', '7', '7', 'lp', '/var/spool/lpd', '/usr/sbin/nologin']
['mail', 'x', '8', '8', 'mail', '/var/mail', '/usr/sbin/nologin']
['news', 'x', '9', '9', 'news', '/var/spool/news', '/usr/sbin/nologin']
['uucp', 'x', '10', '10', 'uucp', '/var/spool/uucp', '/usr/sbin/nologin']
['proxy', 'x', '13', '13', 'proxy', '/bin', '/usr/sbin/nologin']
['www-data', 'x', '33', '33', 'www-data', '/var/www', '/usr/sbin/nologin']
Toujours aussi simple !
Ne pas oublier le paramètre newline='' avec la commande open
En prime, lecture d'un fichier csv à l'aide d'un tuple nommé contenant le nom des champs du fichiers csv.
Très utile pour la manipulation d'un fichier csv complexe.
Pour cela, nous allons utiliser la fonction namedtuple du module collections
>>> from collections import namedtuple
>>> # Nous initialisons la liste des noms de champs
>>> Headers = namedtuple('Headers', 'LoginName, EncryptedPassword, UserId, GroupId, UserName, HomeDirectory, Interpreter')
>>> with open('passwd.csv', newline='') as f:
reader = csv.reader(f)
for header in map(Headers._make, reader):
# Nous pouvons afficher les valeurs à l'aide des attributs nommés
print(header.LoginName, header.HomeDirectory)
root /root
daemon /usr/sbin
bin /bin
sys /dev
sync /bin
games /usr/games
man /var/cache/man
lp /var/spool/lpd
mail /var/mail
news /var/spool/news
uucp /var/spool/uucp
proxy /bin
www-data /var/www
Que dire de plus ...
Commentaires
Martin (non vérifié)
ven, 02/03/2018 - 17:47
Permalien
Modifications
Bonsoir, est-il possible d'effectuer des modifications sur des fichiers csv déjà existants?
Comment peut on sélectionner une ligne en particulier et la supprimer?.
Concrètement, j'ai un fichier csv qui vient d'excel mais il a des trous. Par conséquent je voudrais écrire une procédure qui supprime les lignes qui ont des trous et pouvoir faire de même avec les colonnes.
Merci
ronan
ven, 02/03/2018 - 18:25
Permalien
C'est tout à fait possible.....
..... Il suffit pour cela d'ouvrir deux fichiers en même temps.
C'est à dire, le fichier source en lecture et un fichier cible en écriture.
On lit le fichier source ligne par ligne, on test si la ligne remplit les conditions et on l'écrit dans le nouveau fichier cible.
De cette manière, on écrit dans le nouveau fichier cible que les lignes du fichier source qui conviennent.
Comme un exemple serait beaucoup plus parlant, je te propose d'utiliser mon formulaire de contact pour m'adresser un exemple de ton fichier csv et je posterai un commentaire avec un exemple concret.....
Sardi (non vérifié)
dim, 13/05/2018 - 14:27
Permalien
Question
Est ce que c'est possible de manipuler les commentaire des fichiers csv ?
ronan
lun, 14/05/2018 - 17:05
Permalien
C'est à dire ?
Qu'entends tu par commentaires ?
Corentin (non vérifié)
mer, 30/05/2018 - 16:06
Permalien
Récupération de données
j'ai besoin d'une boucle qui lirait un fichier (.csv) et qui par rapport à une insertion de l'utilisateur récupérerait une donnée précise.
Mon fichier csv contient des informations (en lignes) sur des écoles (Nom, adresses IP)
Par exemple si l'utilisateur tape "Yser" le programme récupérerait donc la ligne complète des données concernant l'école Yser
Je vous donnes un exemple d'une ligne de mon fichier .csv pour que vous comprenez bien :
Yser;0510082m;192.168.11.1;192.168.11.2;192.168.11.10;192.168.11.60;dimanche 22:15;
ronan
mer, 30/05/2018 - 17:40
Permalien
Bonjour
Je ferais de cette manière
TIti (non vérifié)
sam, 02/11/2019 - 19:51
Permalien
Fichier CSV volumineux
Bonsoir ,
J'ai un fichier CSV tres volumineux que je ne peux pas ouvrir et je voudrai recopier les 1000 premieres lignes dans un fiche CSV.
ronan
mar, 05/11/2019 - 08:46
Permalien
Exploiter des fichiers volumineux
Bonjour,
Pour des fichiers CSV très volumineux, je conseille, à la place du module csv,d'utiliser le module pandas.
Pour des opérations basiques, comme celle de recopier les 1000 premières lignes d'un fichier, le module pandas est très simple d'utilisation.
Petit rappel, pour installer le module pandas:
Dans un script python, les quelques lignes qui suivent sufiront à résoudre ton problème.
Et voilà.
En fonction de la volumétrie le traitement peut-être plus ou moins long.
Ajouter un commentaire