Les fichiers

Manipulation des fichiers

Les principales fonctions Python relatives à la manipulation de fichiers se trouvent dans la bibliothèque os .

import os

 

Sur un ordinateur, une tablette, un smartphone, une console de jeu, les fichiers sont organisés par un système de fichiers.

Les fichiers (files) sont placés dans des dossiers (folders) ou répertoires (directories) , organisés en arborescence :

Pour accéder à un fichier, il faut connaitre son chemin (path), une chaîne de caractères de la forme :

NomRacine/NomDossier1/NomDossier2/NomDossier3/NomFichier

Remarque : sous Windows le séparateur est le caractère \ alors que sous Linux, il s’agit du caractère / .

En Python les deux notations sont possibles, mais étant donné la signification particulière du caractère \ , il faudra en mettre deux : \\ (ce qui correspond en fait à un seul \ ).

Exemple : « NomRacine/NomDossier/NomFichier »« NomRacine\\NomDossier\\NomFichier »

Sous Linux, la racine de l’arborescence est simplement notée / .

Notion de chemin relatif et chemin absolu

Un chemin peut être absolu ou relatif.

Absolu ( = relatif au dossier racine ) Relatif (au répertoire courant)
/home/eleve/exos/info/ exos/info/

 

Le répertoire courant

On appelle répertoire courant (ou de travail) (Current Working Directory) le dossier « par défaut » pointé par une application (session Python, fenêtre de commande Windows, terminal Linux, …).

Récupérer le chemin du dossier courant

  • Fonction getcwd() (get Current Working Directory) :

>>> os.getcwd()
'C:\\Python35'

Modifier le chemin du dossier courant

  • Fonction chdir() (change Directory) :

>>> os.chdir("C:\\")
>>> os.getcwd()
'C:\\'

 

Le PYTHON PATH

Le PYTHON PATH indique à python quels dossiers il doit prendre en compte pour sa recherche de modules.

>>> import sys
>>> sys.path

['', 'C:\\Users\\Mon_prenom\\AppData\\Local\\Programs\\Python\\Python36-32\\python36.zip', 'C:\\Users\\Mon_prenom\\AppData\\Local\\Programs\\Python\\Python36-32\\DLLs', ...]

On peut y rajouter des chemins :

sys.path.insert(0, "C:\Users\Mon_prenom")

 

Le dossier « utilisateur »

Il s’agit du dossier par défaut contenant les données de l’utilisateur connecté à la machine.

Il s’agit d’un dossier du genre :

  • sous Windows : C:\Users\Mon_prenom
  • sous Linux : \home\Mon_prenom\

Ce chemin de ce dossier est stocké dans la variable d’environnement HOME :

>>> os.getenv("HOME")
'C:\\Users\\Mon_prenom'

 

Le dossier des applications

Il s’agit du dossier contenant les paramètres « utilisateur » (préférences, …) des applications installées.

Ce chemin de ce dossier est stocké dans la variable d’environnement APPDATA :

>>> os.getenv('APPDATA')
'C:\\Users\\Mon_prenom\\AppData\\Roaming'

C’est l’emplacement qu’il faut choisir lorsqu’on souhaite sauvegarder des données de configuration de l’application que l’on crée.

 

Le fichier du module

Lorsqu’un module Python est chargé ou exécuté, on peut avoir besoin de connaître le nom du fichier .py contenant le script.

Première méthode

Le chemin désignant le fichier d’un module est stocké dans la variable __file__ de ce module :

>>> __file__
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    __file__
NameError: name '__file__' is not defined

C’est normal : si on exécute une commande depuis la console de Python, c’est qu’on ne le fait pas depuis un module !

 

Dans un fichier Mon_Script.py donc :

print(__file__)

… affiche le chemin complet du fichier script :

C:/Users/Mon_prenom/Mes_Scripts_Python/Mon_Script.py

Autre méthode

D’une manière plus générale, si on se rappelle qu’un script Python est interprété par le programme python.exe , exécuter un script (un fichier .py) reviendrait à taper dans une fenêtre la ligne de commande suivante :

python Mon_script.py

  • python désigne le fichier exécutable python.exe (qui se trouve dans le dossier de Python)
  • Mon_script.py désigne le premier argument passé à la ligne de commande

Depuis le script Python, on peut récupérer tous les arguments (il peut y en avoir plusieurs !!) passés à python.exe :

import sys
print(sys.argv)

['C:/Users/Mon_prenom/Mes_Scripts_Python/Mon_Script.py']

D’une manière générale sys.argv est une liste contenant l’ensemble des arguments passés à la commande python.exe (séparés par des espaces).

 

Manipulation des chemins

Décomposer des chemins

Pour séparer d’un chemin la partie dossier de la partie fichier, on utilise la fonction dirname()

os.path.dirname("C:/Users/Mon_prenom/Mes_Scripts_Python/Mon_Script.py")

… qui renvoie :

"C:\Users\Mon_prenom\Mes_Scripts_Python"

ou la fonction basename()

os.path.basename("C:/Users/Mon_prenom/Mes_Scripts_Python/Mon_Script.py")

… qui renvoie :

"Mon_Script.py"

 

Composer des chemins

Pour joindre deux parties d’un chemin, on préfèrera utiliser la fonction join() plutôt qu’une concaténation de chaines :

os.path.join(partie1, partie2)

 

Vérifier l’existence d’un chemin

Il est souvent nécessaire de vérifier qu’un fichier ou un dossier existe réellement sur le support.

pour un dossier :

os.path.isdir(chemin)

pour un fichier :

os.path.isfile(chemin)

 

Toute la documentation sur os.path : https://docs.python.org/3.5/library/os.path.html#os.path.basename

 

Lecture et écriture dans des fichiers

Avant de tester les instructions de cette partie, télécharger le fichier Chaine des Puys.txt dans le dossier de votre choix.

Ouverture d’un fichier

L’accès aux données d’un fichier se fait par des opérations de lecture/écriture.

Dans un fichier, les données sont séquentielles : des octets placés les uns après les autres.

Contrairement aux listes Python pour lesquelles on accède aux données par leur indice (tel un tableau indexé), il faut, dans le cas d’un fichier, déplacer une sorte de « curseur », puis faire l’opération de lecture/écriture.

Avant de pouvoir lire/écrire dans un fichier, il doit être ouvert, et à la fin des opérations, il doit être fermé (sinon il reste verrouillé, et donc pas accessible en écriture à un autre processus).

Le mode d’ouverture choisi détermine le(s) types d’opérations que l’on pourra réaliser sur le fichier , et la position initiale du »curseur » :

  • r = lecture seule, depuis le début
  • w = écriture (et écrasement d’un éventuel fichier portant le même nom) , depuis le début
  • a = écriture ajout, depuis la fin
  • r+ = lecture et écriture, depuis le début

Par défaut, un fichier et ouvert en mode texte : l’élément de base lu/écrit est un caractère.
Mais en ajoutant b au mode, on peut aussi l’ouvrir en mode binaire : l’élément de base lu/écrit est un octet.

 

En Python, les opérations se font sur un objet-fichier (file object).

Pour ouvrir un fichier, on peut utiliser la fonction open(), qui renvoie un objet de type objet-fichier.

f = open('Chaine des Puys.txt')
print(f)

<_io.TextIOWrapper name='Chaine des Puys.txt' mode='r' encoding='cp1252'>

Attention ! sous Linux, les noms de fichier doivent respecter la casse !

'Chaine des Puys.txt'  !=  'chaine des puys.txt'

Lecture d’un fichier texte

Pour lire le contenu entier d’un fichier, on peut utiliser la fonction read() :

S = f.read()
print(S)

'Puy de La Vache\t1167\nGrand Suchet\t1231\nPuy de Dôme\t1465\nGrand Sarcouy\t1147\nPuy Chopine\t1181\nPuy de Louchadière\t1199\nPuy Pariou\t1209\nPuy de Côme\t1252\nPuy de la Nugère\t994\nPuy de la Bannière\t733\nPuy des Goules\t1146\nPuy de Mercœur \t1249\nPuy de Jume\t1163\nPuy de Lassolas\t1187'

Un fichier ouvert doit être refermé après utilisation (sous peine de ne pouvoir être rouvert !) :

f.close()

Exercice
Écrire une fonction dicoPuy() qui renvoie un dictionnaire {nom : altitude} à partir du fichier Chaine-des-Puys.txt.

 

Lorsqu’un fichier est très volumineux, il n’est pas forcément souhaitable d’en stocker tout le contenu en mémoire. Il est à cet effet possible de le parcourir ligne après ligne, car le type objet-fichier est un itérateur :

f = open('Chaine des Puys.txt')
for p in f:
   print(p)
f.close()

Exercice
Écrire une fonction leJustePuy(altitude) permettant de donner le nom du puy le plus proche de l’altitude passée en argument, sans la dépasser, toujours à partir du fichier Chaine-des-Puys.txt.

 

Écrire dans un fichier texte

Par défaut, un fichier est ouvert en mode ‘lecture seule’. Pour pouvoir écrire des données dedans, il faut l’ouvrir en mode écriture (write en anglais) et utiliser la méthode write() :

f = open('Chaine des Puys.txt', 'w')
f.write("Puy de Chalard\t840") # '\t' = caractère Tabulation
f.close()

 

La structure with … as … :

Il existe une autre syntaxesyntaxe La syntaxe concerne le signifiant, soit ce qu'est l'énoncé. plus courte qui permet de s’émanciper du problème de fermeture du fichier : la structure with … as … : .

with open('Chaine des Puys.txt', 'r') as fichier:
   print(fichier.read())

Si une exception se produit, le fichier sera tout de même fermé à la fin du bloc.

 

Quelques modules utiles

Enregistrement d’objets complexes

Le module pickle , faisant partie de la distribution Python, permet de lire et enregistrer des données plus complexes que des caractères ou des octets : des listes, des dictionnaires, ….

Pour en savoir plus : https://docs.python.org/3.5/library/pickle.html

Manipulation de fichiers CSV

Lorsqu’il s’agit d’enregistrer des données issues de mesures par exemple, le format CSV est approprié. Il existe un module Python qui facilite les manipulations de fichiers CSV

Pour en savoir plus : https://docs.python.org/fr/3/library/csv.html

 

Fichiers de configuration

Un fichier de configuration est un fichier texte dont le contenu est divisé en rubriques qui contiennent une suite d’association nom – valeur :

[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes

[bitbucket.org]
User = hg

[topsecret.server.com]
Port = 50022
ForwardX11 = no

 

Pour en savoir plus : https://docs.python.org/3/library/configparser.html

 

Vous aimerez aussi...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

code