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
)
>>>
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▲
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\n
Contenu 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.
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
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()
>>>
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()
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
>>>
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
>>>
f =
open(
'hello_world.py'
, 'r'
, encoding=
'ascii'
)
>>>
f.closed
False
>>>
f.close
(
)
>>>
f.closed
True
X-C. Écriture dans des fichiers▲
#!/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'
$ ./
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▲
#!/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
$ ./
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.