IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Les bases de la programmation Python par l’exemple


précédentsommairesuivant

X. Gestion des fichiers

Dans ce chapitre, nous traiterons :

  • la fonction Open ;
  • la lecture de fichiers ;
  • l’écriture dans des fichiers ;
  • l’édition « à la volée » avec fileinput.

X-A. Fonction Open

  • Syntaxe : open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
 
Sélectionnez
>>> import locale
>>> locale.getpreferredencoding()
'UTF-8'
  • 3 modes d’ouverture  :

    • r ouvre les fichiers pour lecture ;
    • w ouvre les fichiers pour écriture ;
    • a ouvre les fichiers pour ajout.
  • Le mode par défaut est le mode texte, les arguments ‘r’ et ‘rt’ sont donc équivalents

    • Pour le mode binaire, ce sera ‘rb', 'wb' etc.
  • locale.getpreferredencoding() donne l’encodage par défaut à utiliser.
  • Python docs - open
  • Python docs - standard encodings

X-B. Lecture de fichiers

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#!/usr/bin/python3

# Ouvrir le fichier, lire ligne par ligne et l’afficher
filename = 'hello_world.py'
f = open(filename, 'r', encoding='ascii')

print("Contenu de " + filename)
print('-' * 30)
for line in f:
    print(line, end='')

f.close()

# 'with' est une solution plus simple, qui gère automatiquement la fermeture du fichier.
filename = 'while_loop.py'

print("\n\nContenu de " + filename)
print('-' * 30)
with open(filename, 'r', encoding='ascii') as f:
    for line in f:
        print(line, end='')
  • L’encodage par défaut est habituellement ‘UTF-8’, utilisez ‘ASCII’ quand c’est possible.
  • Utiliser with et le nom de gestionnaire de f est une convention répandue.
 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
$ ./file_reading.py
Contenu de hello_world.py
------------------------------
#!/usr/bin/python3

print("Hello World")


Contenu de while_loop.py
------------------------------
#!/usr/bin/python3

# demande continuellement une entrée jusqu’à saisie d’un entier positif
usr_string = 'not a number'
while not usr_string.isnumeric():
    usr_string = input("Entrez un entier positif : ")

Si le fichier n’existe pas

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
#!/usr/bin/python3

with open('xyz.py', 'r', encoding='ascii') as f:
    for line in f:
        print(line, end='')
Erreur si le fichier n’existe pas :
$ ./file_reading_error.py 
Traceback (most recent call last):
  File "./file_reading_error.py", line 3, in <module>
    with open('xyz.py', 'r', encoding='ascii') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'xyz.py'
$ echo $?
1
  • Lire le contenu du fichier en entier comme une unique chaîne de texte en utilisant read()
 
Sélectionnez
>>> f = open('hello_world.py', 'r', encoding='ascii')
>>> f
<_io.TextIOWrapper name='hello_world.py' mode='r' encoding='ascii'>
>>> print(f.read())
#!/usr/bin/python3

print("Hello World")
  • Lire ligne par ligne en utilisant readline()
 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
>>> f = open('hello_world.py', 'r', encoding='ascii')
>>> print(f.readline(), end='')
#!/usr/bin/python3
>>> print(f.readline(), end='')

>>> print(f.readline(), end='')
print("Hello World")

>>> f.close()
>>> print(f.readline(), end='')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file.
  • Lire toutes les lignes du fichier en tant que liste en utilisant readlines()

    • Veuillez noter la forme plurielle
 
Sélectionnez
>>> f = open('hello_world.py', 'r', encoding='ascii')
>>> all_lines = f.readlines()
>>> all_lines
['#!/usr/bin/python3\n', '\n', 'print("Hello World")\n']
  • Vérifier si le fichier est fermé ou non
 
Sélectionnez
>>> f = open('hello_world.py', 'r', encoding='ascii')

>>> f.closed
False

>>> f.close()
>>> f.closed
True

X-C. Écriture dans des fichiers

 
Sélectionnez
#!/usr/bin/python3

with open('new_file.txt', 'w', encoding='ascii') as f:
    f.write("C’est une simple ligne de texte\n")
    f.write("Une autre ligne\n")
  • Utilisez la méthode write() pour écrire une chaîne de texte dans le fichier.
  • Pour ajouter du texte à un fichier existant, utilisez le mode 'a' plutôt que le mode 'w'
 
Sélectionnez
$ ./file_writing.py
$ cat new_file.txt 
This is a sample line of text
Yet another line

X-D. Édition « à la volée » avec fileinput

 
Sélectionnez
#!/usr/bin/python3

import fileinput

with fileinput.input(inplace=True) as f:
    for line in f:
        line = line.replace('line of text', 'line')
        print(line, end='')
  • Les fichiers qui doivent être modifiés sont spécifiés comme arguments de ligne de commande quand le programme est lancé.
  • Notez que la fonction print doit être utilisée au lieu de f.write
  • Avec la lecture par ligne, chaque itération a déjà un caractère de nouvelle ligne, end est alors assigné comme un caractère vide.
  • Python docs - fileinput
 
Sélectionnez
$ ./inplace_file_editing.py new_file.txt
$ cat new_file.txt 
C’est une simple ligne
Une autre ligne

$ # pour modifier tous les fichiers avec .txt dans le dossier courant, utilisez
$ ./inplace_file_editing.py *.txt

$ # stdin peut aussi être passé en tant qu’entrée inplace est désactivé
$ echo 'a line of text' | ./inplace_file_editing.py
a line
  • Spécifier les noms de fichiers et extensions pour les sauvegardes.
 
Sélectionnez
# Pour spécifier un nom de fichier dans le programme lui-même
with fileinput.input(inplace=True, files=('file1.txt', 'file2.txt')) as f:

# Pour créer une sauvegarde du fichier original, spécifiez une extension au paramètre backup
with fileinput.input(inplace=True, backup='.bkp') as f:

précédentsommairesuivant

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2018 Sundeep Agarwal. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.