Python site

Chapitre 3 : Lecture, écriture et fermeture des fichiers

Commençons avec une solution simple proposée en python pour lire un fichier, par exemple un fichier csv. Faites abstraction du chargement de pandas dans un premier temps, on reviendra sur cetta librairie plus tard !

import pandas as pd
data = pd.read_csv("train.csv", sep=";", header=0)
data.head(2)

Ces commandes illustrent la facilité offerte par python pour charger et consulter un jeu de données. Toutefois, avant d’étudier des méthodes d’ouverture et de lecture de fichiers spécifiées dans des packages spécifiques tels que pandas, commençons par mettre en oeuvre les fonctions de la librairie standard. En effet, même si elles sont légèrement plus complexes, elles peuvent s’avérer utile. Par exemple, le jeu de données initial peut être trop volumineux pour être entièrement chargé en mémoire. Cette contrainte est pourtant imposée lors du chargement des données avec le package pandas.

Ainsi, pour lire ou écrire dans un fichier, il suffit d’utiliser la fonction open et de spécifier son action dans le paramètre mode. Les modalités de ce paramètre sont précisées dans le tableau ci-dessous :

Paramètre mode Type d’accès associé
‘r’ accès en lecture seule ; erreur si le fichier n’existe pas
‘w’ accès en écriture ; si le fichier n’existe pas, il est créé ; s’il existe, son contenu est écrasé
‘r+’ accès en lecture et écriture, permettant de lire et intercaler des données dans le fichier
‘a’ accès en mode ajout (append) ; si le fichier n’existe pas, il est créé ; s’il existe, son contenu est laissé intact, et les écritures s’effectuent à la fin du fichier

Dans le paramètre mode, il est possible de spécifier aussi le type de fichier (’t’ pour le mode texte et ‘b’ pour le mode binaire). Cette lettre doit être concaténée à la lettre précisant le type d’accès souhaité (lecture ou écriture).

Le pendant de la commande open est la commande close.

# Commençons par ouvrir un fichier (par exemple, un fichier txt ou un csv)
fd = open('train.csv', mode='r')

Trois fonctions permettent de parcourir le fichier ouvert :

  • Pour lire une ligne : fd.readline()
  • Pour lire toutes les lignes (avec la fonction readline()) jusqu’à la fin du fichier et renvoie une liste de lignes : fd.readlines()
  • Pour lire complètement un bloc : fd.read() Pour ces 3 fonctions, il est possible de passer un nombre d’octets à lire en paramètre.

Attention au type d’encodage du fichier à lire ou à écrire ! Par défaut python est en utf8, alors que bien souvent les fichiers créés sous windows sont en latin1.

# Exemples de code avec variable *encoding*
fd1 = open('train1.csv', mode='r',encoding='latin1')
fd2 = open('train2.csv', mode='r',encoding='utf8')

Test 1 : Tester chacune des trois méthodes avec le fichier communes2019.csv

Test 2 : Que se passe-t-il quand on effectue deux fois de suite la commande fd.readline()

Test 2bis : Retester fd.readline() après avoir fait fd.seek(0)

A chaque readline(), on passe à la ligne suivante. Pour rester sur la première ligne, il faut :

  • soit ré-éxécuter l’ouverture du fichier (open)
  • fd.seek(0) permet aussi de se repositionnement au début fichier !

Les manières d’ouvrir les fichiers présentées ci-dessus ne sont pas les plus élégantes, ni les plus efficaces pour travailler avec les fichiers. Sur la base des commandes déjà présentées, il est plutôt conseillé d’utiliser le code suivant (avec les instructions try et finally qui prennent en charge les erreurs et la fin de fichier) :

fd = open('./data/commune2019.csv', mode='r')
try:
    print(fd.readline())
finally:
    reader.close()

Encore plus élégant (the “pythonic way”), il est préférable ouvrir un fichier avec la fonction with.

Test 3 : A partir de l’instruction with et de la fonction readline, afficher l’ensemble des lignes

L’instruction with implique automatiquement la fermeture du fichier en fin d’itération. Il est préférable d’utiliser systématiquement cette instruction.

Encore plus élégant (the “most pythonic way”), il est préférable ouvrir un fichier avec la fonction with et de parcourir le fichier avec une boucle for. Cette méthode est bien plus économe en mémoire car le fichier n’est pas chargé intégralement en mémoire pour être traité, comme avec les fonctions read. En effet, seul un bloc de ligne est chargé en mémoire avant d’être traité puis il est remplacé par le bloc suivant.

Test 4 : A partir des instructions with et for, afficher l’ensemble des lignes

Test 5 : Appliquer une méthode pour lire un fichier txt et n’afficher que les deux premières observations, en ne tenant pas compte de la ligne d’entête.

A noter, il est aussi possible de ‘sauter’ une ligne avec l’instruction next. En effet, l’objet créé avec with open est un itérateur, et on peut donc passer au suivant avec un next(itérateur).

Il est aussi possible d’ouvrir les données avec le package fileinput en utilisant le code ci-dessous :

import fileinput
for line in fileinput.input('train.csv'):
    print(line)
fileinput.close()

Avec ces méthodes pour lire les données, on lit “un enregistrement”. Il faut ensuite le découper en champs à l’aide du séparateur (en règle générale , ou ;). Pour ce faire, il faut utiliser la fonction split(“séparateur”).

Par exemple :

with open(‘commune2019.csv’, ‘r’) as reader: for line in reader: print(line.strip().split(”,"))

On a également utilisé la fonction strip pour enlever les éventuels blancs inutiles à droite et à gauche de chaque champs.

Des modules permettent de lire spécifiquement des fichiers csv ou json et de faire ce découpage sur le séparateur et retourne le résultat dans une liste :

  • le module csv : csv.reader() et csv.writer() pour lire et écrire les lignes au sein d’un csv. Ces commandes acceptent en option le mot-clé delimiter= pour préciser le choix du caractère de séparation, par défaut ‘,’
  • le module json : json.dumps() (nécessaires en cas de json emboîtés) suivi d’un json.loads()

Test 6 : Utiliser le module csv pour importer et afficher le contenu du fichier communes.csv

Test 7 : Nettoyer le fichier commune2019.csv en ne gardant que les communes avec un “typecom"="COM” et les champs “com”, “reg”, “libelle” et générer un nouveau csv (utf8 et delimiteur ,) avec un format d’enregistrement depcom, libelle, reg

Test 8 : Charger ce nouveau fichier dans un dictionnaire

Last updated on 18 Mar 2019 / Published on 18 Mar 2019
Edit on GitHub