Les Entrées-Sorties - Documentation Python 3.12.2
Les Entrées-Sorties - Documentation Python 3.12.2
Les Entrées-Sorties - Documentation Python 3.12.2
Les entrées/sorties
Il existe bien des moyens de présenter les sorties d'un programme ; les données
peuvent être affichées sous une forme lisible par un être humain ou sauvegardées
dans un fichier pour une utilisation future. Ce chapitre présente quelques possibi-
lités.
Souvent vous voudrez plus de contrôle sur le formatage de vos sorties et aller au
delà d’un affichage de valeurs séparées par des espaces. Il y a plusieurs moyens
de les formater.
https://docs.python.org/fr/3/tutorial/inputoutput.html 24/03/2024 16 14
Page 1 sur 13
:
>>> '{:-9} YES votes {:2.2%}'.format(yes_votes, percentage)
' 42572654 YES votes 49.67%'
Lorsque qu'un affichage basique suffit, pour afficher simplement une variable
pour en inspecter le contenu, vous pouvez convertir n'importe quelle valeur en
chaîne de caractères en utilisant la fonction repr() ou la fonction str() .
La fonction str() est destinée à représenter les valeurs sous une forme lisible
par un être humain, alors que la fonction repr() est destinée à générer des re-
présentations qui puissent être lues par l'interpréteur (ou qui lèvera une
SyntaxError s'il n'existe aucune syntaxe équivalente). Pour les objets qui n'ont
pas de représentation humaine spécifique, str() renvoie la même valeur que
repr() . Beaucoup de valeurs, comme les nombres ou les structures telles que
les listes ou les dictionnaires, ont la même représentation en utilisant les deux
fonctions. Les chaînes de caractères, en particulier, ont deux représentations dis-
tinctes.
Quelques exemples :
https://docs.python.org/fr/3/tutorial/inputoutput.html 24/03/2024 16 14
Page 2 sur 13
:
... repr((x, y, ('spam', 'eggs')))
"(32.5, 40000, ('spam', 'eggs'))"
Le module string contient une classe Template qui permet aussi de remplacer
des valeurs au sein de chaînes de caractères, en utilisant des marqueurs comme
$x , et en les remplaçant par les valeurs d'un dictionnaire, mais sa capacité à for-
mater les chaînes est plus limitée.
L'expression peut être suivie d'un spécificateur de format. Cela permet un plus
grand contrôle sur la façon dont la valeur est rendue. L'exemple suivant arrondit
pi à trois décimales après la virgule :
D’autres modificateurs peuvent être utilisés pour convertir la valeur avant son for-
matage. '!a' applique ascii() , '!s' applique str() , et '!r' applique
repr() :
https://docs.python.org/fr/3/tutorial/inputoutput.html 24/03/2024 16 14
Page 3 sur 13
:
>>> print(f'My hovercraft is full of {animals!r}.')
My hovercraft is full of 'eels'.
>>>
>>> print('We are the {} who say "{}!"'.format('knights', 'Ni'))
We are the knights who say "Ni!"
https://docs.python.org/fr/3/tutorial/inputoutput.html 24/03/2024 16 14
Page 4 sur 13
:
Les arguments positionnés et nommés peuvent être combinés arbitrairement :
>>> 'Manfred
>>> print('The story of {0}, {1}, and {other}.'.format('Bill',
... other='Georg'))
The story of Bill, Manfred, and Georg.
Si vous avez une chaîne de formatage vraiment longue que vous ne voulez pas
découper, il est possible de référencer les variables à formater par leur nom plutôt
que par leur position. Utilisez simplement un dictionnaire et la notation entre cro-
chets '[]' pour accéder aux clés
https://docs.python.org/fr/3/tutorial/inputoutput.html 24/03/2024 16 14
Page 5 sur 13
:
Pour avoir une description complète du formatage des chaînes de caractères
avec la méthode str.format() , lisez : Syntaxe de formatage de chaîne.
Il existe une autre méthode, str.zfill() , qui comble une chaîne numérique à
gauche avec des zéros. Elle comprend les signes plus et moins :
https://docs.python.org/fr/3/tutorial/inputoutput.html 24/03/2024 16 14
Page 6 sur 13
:
>>> '-3.14'.zfill(7)
'-003.14'
>>> '3.14159265359'.zfill(5)
'3.14159265359'
L'opérateur % (modulo) peut également être utilisé pour le formatage des chaînes
de caractères. Pour 'string' % values , les instances de % dans la chaine de
caractères string sont remplacées par zéro ou plusieurs d'éléments de values .
Cette opération est communément appelée interpolation de chaîne de caractères.
Par exemple :
Normalement, les fichiers sont ouverts en mode texte, c'est-à-dire que vous lisez
et écrivez des chaînes de caractères depuis et dans ce fichier, suivant un enco-
https://docs.python.org/fr/3/tutorial/inputoutput.html 24/03/2024 16 14
Page 7 sur 13
:
dage donné via encoding. Si encoding n'est pas spécifié, l'encodage par défaut
dépend de la plateforme (voir open() ). UTF-8 étant le standard moderne de fac-
to, encoding="utf-8" est recommandé à moins que vous ne sachiez que vous
devez utiliser un autre encodage. L’ajout d’un 'b' au mode ouvre le fichier en
mode binaire. Les données en mode binaire sont lues et écrites sous forme d’ob-
jets bytes . Vous ne pouvez pas spécifier encoding lorsque vous ouvrez un fichier
en mode binaire.
En mode texte, le comportement par défaut, à la lecture, est de convertir les fin
de lignes spécifiques à la plateforme ( \n sur Unix, \r\n sur Windows, etc.) en
simples \n . Lors de l'écriture, le comportement par défaut est d'appliquer l'opé-
ration inverse : les \n sont convertis dans leur équivalent sur la plateforme cou-
rante. Ces modifications effectuées automatiquement sont normales pour du
texte mais détérioreraient des données binaires contenues dans un fichier de
type JPEG ou EXE . Soyez particulièrement attentifs à ouvrir ces fichiers binaires
en mode binaire.
C'est une bonne pratique d'utiliser le mot-clé with lorsque vous traitez des fi-
chiers. Vous fermez ainsi toujours correctement le fichier, même si une exception
est levée. Utiliser with est aussi beaucoup plus court que d'utiliser l'équivalent
avec des blocs try … finally :
>>> # We can check that the file has been automatically closed.
>>> f.closed
True
Si vous n'utilisez pas le mot clé with , vous devez appeler f.close() pour fer-
mer le fichier, et ainsi immédiatement libérer les ressources qu'il utilise.
https://docs.python.org/fr/3/tutorial/inputoutput.html 24/03/2024 16 14
Page 8 sur 13
:
Après la fermeture du fichier, que ce soit via une instruction with ou en appelant
f.close() , toute tentative d'utilisation de l'objet fichier échoue systématique-
ment.
Les derniers exemples de cette section supposent qu'un objet fichier appelé f a
déjà été créé.
Pour lire le contenu d'un fichier, appelez f.read(taille) , cette dernière lit une
certaine quantité de données et la renvoie sous forme de chaîne (en mode texte)
ou d'objet bytes (en mode binaire). taille est un argument numérique facultatif.
Lorsque taille est omis ou négatif, la totalité du contenu du fichier sera lue et ren-
voyée ; c'est votre problème si le fichier est deux fois plus grand que la mémoire
de votre machine. Sinon, au maximum taille caractères (en mode texte) ou taille
octets (en mode binaire) sont lus et renvoyés. Si la fin du fichier est atteinte,
f.read() renvoie une chaîne vide ( '' ).
f.readline() lit une seule ligne du fichier ; un caractère de fin de ligne ( \n ) est
laissé à la fin de la chaîne. Il n'est omis que sur la dernière ligne du fichier si celui-
ci ne se termine pas un caractère de fin de ligne. Ceci permet de rendre la valeur
de retour non ambigüe : si f.readline() renvoie une chaîne vide, c'est que la
fin du fichier a été atteinte, alors qu'une ligne vide est représentée par '\n' (une
chaîne de caractères ne contenant qu'une fin de ligne).
https://docs.python.org/fr/3/tutorial/inputoutput.html 24/03/2024 16 14
Page 9 sur 13
:
'Second line of the file\n'
>>> f.readline()
''
Pour lire ligne à ligne, vous pouvez aussi boucler sur l'objet fichier. C'est plus effi-
cace en termes de gestion mémoire, plus rapide et donne un code plus simple :
Pour construire une liste avec toutes les lignes d'un fichier, il est aussi possible
d'utiliser list(f) ou f.readlines() .
Les autres types doivent être convertis, soit en une chaîne (en mode texte), soit
en objet bytes (en mode binaire) avant de les écrire :
https://docs.python.org/fr/3/tutorial/inputoutput.html 24/03/2024 16 14
Page 10 sur 13
:
>>> f = open('workfile', 'rb+') >>>
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5) # Go to the 6th byte in the file
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2) # Go to the 3rd byte before the end
13
>>> f.read(1)
b'd'
Sur un fichier en mode texte (ceux ouverts sans b dans le mode), seuls les chan-
gements de position relatifs au début du fichier sont autorisés (sauf une excep-
tion : se rendre à la fin du fichier avec seek(0, 2) ) et les seules valeurs pos-
sibles pour le paramètre décalage sont les valeurs renvoyées par f.tell() , ou
zéro. Toute autre valeur pour le paramètre décalage produit un comportement
indéfini.
File objects have some additional methods, such as isatty() and truncate()
which are less frequently used; consult the Library Reference for a complete
guide to file objects.
Strings can easily be written to and read from a file. Numbers take a bit more ef-
fort, since the read() method only returns strings, which will have to be passed
to a function like int() , which takes a string like '123' and returns its numeric
value 123. When you want to save more complex data types like nested lists and
dictionaries, parsing and serializing by hand becomes complicated.
Plutôt que de passer son temps à écrire et déboguer du code permettant de sau-
vegarder des types de données compliqués, Python permet d'utiliser JSON
(*JavaScript Object Notation*), un format répandu de représentation et
d'échange de données. Le module standard appelé json peut transformer des
données hiérarchisées Python en une représentation sous forme de chaîne de
caractères. Ce processus est nommé sérialiser. Reconstruire les données à partir
https://docs.python.org/fr/3/tutorial/inputoutput.html 24/03/2024 16 14
Page 11 sur 13
:
de leur représentation sous forme de chaîne est appelé déserialiser. Entre sa sé-
rialisation et sa dé-sérialisation, la chaîne représentant les données peut avoir été
stockée ou transmise à une autre machine.
Note: Le format JSON est couramment utilisé dans les applications modernes
pour échanger des données. Beaucoup de développeurs le maîtrisent, ce qui
en fait un format de prédilection pour l'interopérabilité.
Si vous avez un objet x , vous pouvez voir sa représentation JSON en tapant sim-
plement :
json.dump(x, f)
Pour reconstruire l'objet, si f est cette fois un binary file ou un text file ouvert en
lecture :
x = json.load(f)
Cette méthode de sérialisation peut sérialiser des listes et des dictionnaires. Mais
sérialiser d'autres types de données requiert un peu plus de travail. La documen-
tation du module json explique comment faire.
https://docs.python.org/fr/3/tutorial/inputoutput.html 24/03/2024 16 14
Page 12 sur 13
:
Au contraire de JSON, pickle est un protocole permettant la sérialisation d'ob-
jets Python arbitrairement complexes. Il est donc spécifique à Python et ne
peut pas être utilisé pour communiquer avec d'autres langages. Il est aussi, par
défaut, une source de vulnérabilité : dé-sérialiser des données au format pickle
provenant d'une source malveillante et particulièrement habile peut mener à
exécuter du code arbitraire.
https://docs.python.org/fr/3/tutorial/inputoutput.html 24/03/2024 16 14
Page 13 sur 13
: