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 !

infoLa 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)

warning 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 !

warning 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

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

..... 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.....

Est ce que c'est possible de manipuler les commentaire des fichiers csv ?

Qu'entends tu par commentaires ?

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;

Je ferais de cette manière

>>> with open('fichier.csv', encoding='utf8', mode='r', newline='') as f1:
    reader = csv.reader(f1, delimiter=';')
    for row in reader:
        if row[0] == 'Yser':
            print(row)

            
['Yser', '0510082m', '192.168.11.1', '192.168.11.2', '192.168.11.10', '192.168.11.60', 'dimanche 22:15', '']

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.

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:

python3 -m pip install --upgrade pandas

Dans un script python, les quelques lignes qui suivent sufiront à résoudre ton problème.

import pandas as pd
csv = pd.read_csv(r'C:\Users\rquennec\Downloads\monfichier.csv', sep=';')
csv.head(1000).to_csv(r'C:\Users\rquennec\Downloads\monnouveaufichier.csv', index=False, sep=';')

Et voilà.
En fonction de la volumétrie le traitement peut-être plus ou moins long.

Ajouter un commentaire

Filtered HTML

  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Tags HTML autorisés : <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.

Plain text

  • Aucune balise HTML autorisée.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
CAPTCHA
Cette question permet de s'assurer que vous êtes un utilisateur humain et non un logiciel automatisé de pollupostage.
CAPTCHA visuel
Entrez les caractères (sans espace) affichés dans l'image.