Python – Fichiers

Eric Obermeyer – Actualisation: septembre 2014

 

I) Les modules os et os.path. 1

1) Contenu. 1

2) Chemins: slashs ou antislashs ?. 1

3) Outils les plus courants. 1

II) Ecrire ou lire du texte dans un fichier. 2

1) Mode d'emploi 2

2) Ecriture. 2

3) Lecture. 2

4) Méthode conseillée de lecture ou écriture d'un fichier. 2

III) Ecrire ou lire dans un fichier binaire. 2

1) Principe. 2

2) Récupérer sous forme d'une liste d'entiers la liste d'octets contenue dans un fichier binaire. 2

3) Enregistrer dans un fichier une liste d'entiers de {0,…,255} convertie en liste d'octets. 3

IV) Ecrire ou lire un objet Python dans un fichier. 3

V) Problèmes liés à l'encodage. 3

1) La norme Unicode et les normes d'encodage. 3

2) Conversions  chaîne -  liste d'octets suivant une norme d'encodage. 4

3) Lire ou enregistrer un fichier texte en précisant la norme d'encodage. 4

 

I) Les modules os et os.path

1) Contenu

·       Le module os contient les outils permettant d'interagir avec le système d'exploitation

·       Le module os.path contient les outils permettant de manipuler les chemins absolus ou relatifs des fichiers ou répertoires

2) Chemins: slashs ou antislashs ?

Dans Windows,  les chemins des fichiers sont écrits avec des antislashs (\).

Dans Python sous Windows, les chemins doivent  être écrits avec des slashs (/) ou des doubles antislashs (\\).  En effet le caractère \ est le caractère d'échappement dans une chaîne de caractères.

3) Outils les plus courants

os.getcwd()           # répertoire courant

 

Dans les méthodes suivantes, les chemins peuvent être relatifs (on travaille dans le répertoire courant) ou absolus (décrits depuis la racine d'un lecteur).

 

os.chdir(chemin)           # changer le répertoire courant

os.mkdir(chemin)           # créer un répertoire

os.path.exists(chemin)     # teste l'existence d'un fichier ou répertoire

 II) Ecrire ou lire du texte dans un fichier

1) Mode d'emploi

Pour lire ou écrire dans un fichier, on doit:

1)  Ouvrir le fichier avec la méthode open()  en choisissant le mode d'ouverture:

       (r)   Lecture

       (w) Ecriture en  écrasant l'actuel fichier ou en le créant le fichier s'il n'existe pas

       (a)  Ecriture en ajoutant les données au fichier s'il existe déjà ou en le créant le fichier s'il n'existe pas

2) Ecrire ou lire  les données

3) Fermer le fichier avec la méthode close()

2) Ecriture

fich = open(nom_fichier,"w")    # Ouverture en écriture ("a" pour ajout)

fich.write("texte")             # Ecrire un texte

print("texte", file = fich)     # Ecrire un texte

fich.write("texte\n")           # Ecrire un texte et aller à la ligne

fich.writelines(liste_textes)   # Ecrire une liste de textes

fich.close()                    # Le fichier doit être fermé

3) Lecture

fich = open(nom_fichier,"r")    # Ouverture en lecture

contenu = fich.read()           # Tout le fichier

ligne_suivante = fich.readline() # Ligne suivante du fichier

liste_lignes = fich.readlines() # Liste des lignes du fichier

extrait = fich.read(n)          # n octets du fichier

fich.close()                    # Le fichier doit être fermé

 

Pour afficher ligne par ligne le contenu d'un fichier:

for ligne in open(nom_fichier,"r"):

   print(ligne[:-1])                  # pour éviter deux retours à la ligne f.close()

4) Méthode conseillée de lecture ou écriture d'un fichier

L'utilisation du mot clé with permet de manipuler en lecture ou écriture  un fichier sans avoir besoin de le fermer avec close(), et (c'est l'important) en libérant la ressource (le fichier) quelles que soient les éventuelles erreurs qui se pourraient se produire.

with open(nom_fichier,"w") as fich:        # Ouverture par exemple en écriture

    fich.write("Salut les copains !")       # Par exemple

III) Ecrire ou lire dans un fichier binaire

Tous les fichiers sont des fichiers binaires.

1) Principe

Les procédures sont les mêmes que pour la manipulation d'un fichier texte. Il faut juste :

·       Ajouter "b" aux options d'accès: "wb" , "ab", "rb"

·       Ecrire et lire des données du type bytes

2) Récupérer sous forme d'une liste d'entiers la liste d'octets contenue dans un fichier binaire

def lire_fichier(nom_fichier):

    """ Liste d’octets contenus dans fichier appelé nom_fichier convertis en

    une liste d’entiers de {0,...,255}"""

    with open(nom_fichier, "rb") as fich: # Ouverture en lecture de fichier

     contenu = fich.read()          # Lecture du contenu (bytes) du fichier

    return list(map(int, contenu))         # Conversion en une liste d'entiers

3) Enregistrer dans un fichier une liste d'entiers de {0,…,255} convertie en liste d'octets

def enregistrer_fichier(nom_fichier, contenu):

    """Enregistrement du contenu dans le fichier appelé nom_fichier.

    Contenu est une liste d’entiers de {0,...,255} qui est convertie en octets

    avant l’enregistrement"""

    with open(nom_fichier, "wb") as fich:  # Ouverture en écriture du fichier

        fich.write(bytes(contenu))         # Enregistrement après conversion

IV) Ecrire ou lire un objet Python dans un fichier

Pour sauvegarder dans un fichier par exemple une liste d'entiers ou un objet Python plus sophistiqué et le récupérer ultérieurement sous la même forme, il faut utiliser le module pickle.

Lecture et écritures doivent être faites en mode d'accès binaire: "wb" , "ab", "rb"

import pickle

 

with open(nom_fichier,"wb") as fich:  # Il est conseillé d'utiliser with

   pickle.dump(objet, fich)           # objet est enregistré dans fichier

   objet = pickle.load(fich)          # on récupère l'objet suivant de fichier

  V) Problèmes liés à l'encodage

1) La norme Unicode et les normes d'encodage

Pour Python, les chaînes de caractères (type str) sont des chaînes de caractères Unicode.

 

La norme Unicode attribue à chaque caractère ou symbole de toutes (c'est l'objectif) les langues du monde un identifiant unique: un entier, appelé point de code. La fonction chr() permet d'obtenir le caractère correspondant à un code donné. Par exemple:

 

def symboles_maths():

    s = ""

    for i in range(8704, 8730):

        s = s + chr(i)

    print(s)

#renvoie

∀∁∃∄∅∇∈∉∊∋∌∍∎∑−∓∔∖∗∘

 

Un fichier informatique étant une suite finie d'octets, il faut définir pour chaque caractère la suite finie d'octets le représentant dans le fichier.

C'est la norme d'encodage qui précise cela. Pour des raisons historiques (entre autres minimiser la place en mémoire), il en existe beaucoup. Les plus utilisées sont:

·       la norme historique ASCII

·       la norme Latin-1, utilisée en Europe occidentale

·       la norme ANSI ou Windows-1252, utilisée par l'OS Windows

·       la norme UTF8, qui tend à s'imposer

·       la norme mbcs (propre à Python) qui est adaptée à un environnement Windows

 

Seule la norme UTF8 permet d'encoder tous les caractères du jeu Unicode.

 

Tant qu'un script Python ne lit pas ou n'enregistre pas un fichier, le problème de l'encodage ne se pose pas.


 

2) Conversions  chaîne -  liste d'octets suivant une norme d'encodage

Les méthodes encode() et decode() permettent de convertir une chaîne Unicode (type str) en une liste d'octets (type bytes) et réciproquement

def decodage_chaine():

    """ Encodage d'une chaîne Unicode"""

    s = "où est l'€ d'éric ?"       # chaîne Unicode à encoder

    s_enc1 = s.encode("mbcs")       # encodage windows

    s_enc1 = bytes(s, "mbcs")       # c'est équivalent

    s_enc2 = s.encode("utf8")       # encodage utf8

    s_enc2 = bytes(s, "utf8")       # c'est équivalent

    print(s_enc1.decode("mbcs"))    # décodage windows

    print(s_enc2.decode("utf8"))    # décodage utf8

 

#renvoie

 

b"o\xf9 est l'\x80 d'\xe9ric ?" <class 'bytes'>

b"o\xc3\xb9 est l'\xe2\x82\xac d'\xc3\xa9ric ?" <class 'bytes'>

[111, 249, 32, 101, 115, 116, 32, 108, 39, 128, 32, 100, 39, 233, 114, 105, 99, 32, 63]

[111, 195, 185, 32, 101, 115, 116, 32, 108, 39, 226, 130, 172, 32, 100, 39, 195, 169, 114, 105, 99, 32, 63]

où est l'€ d'éric ?

où est l'€ d'éric ?

 

Si l'on ajoute par exemple le caractère à la chaîne à encoder, l'encodage Windows ne sera plus possible.

 

3) Lire ou enregistrer un fichier texte en précisant la norme d'encodage

Lorsqu'on lit ou écrit un fichier texte avec pour norme d'encodage une norme particulière, il faut le préciser dans la méthode open(), le paramètre encoding = "norme d'encodage choisie".

 

Par exemple:

def ecriture(nom_fichier):

    s= "où est l'€ d'éric ?"

    with open(nom_fichier, "w", encoding = "utf8") as fich:

        fich.write(s)