Entrées et sorties en Python3

Dans les chapitres précédents, nous avons en fait déjà abordé la fonctionnalité d'entrée et de sortie de Python. Dans ce chapitre, nous présenterons spécifiquement les entrées et sorties de Python.


Formatage de sortie plus élaboré

Python dispose de deux façons d'afficher des valeurs : les instructions d'expression et la fonction print().

Une troisième façon consiste à utiliser la méthode write() des objets fichiers ; le fichier de sortie standard peut être référencé par sys.stdout.

Si vous souhaitez plus de variété dans la forme de sortie, vous pouvez utiliser la fonction str.format() pour formater les valeurs de sortie.

Si vous souhaitez convertir des valeurs de sortie en chaînes de caractères, vous pouvez utiliser les fonctions repr() ou str().

  • str():La fonction renvoie une représentation lisible par l'utilisateur.
  • repr():Il produit une représentation lisible par l'interpréteur.

Exemple

>>> s = 'Bonjour, Exemple'
>>> str(s)
'Bonjour, Exemple'
>>> repr(s)
"'Bonjour, Exemple'"
>>> str(1/7)
'0.14285714285714285'
>>> x = 10 * 3.25
>>> y = 200 * 200
>>> s = 'La valeur de x est: ' + repr(x) + ', la valeur de y est:' + repr(y) + '...'
>>> print(s)
La valeur de x est:32.5,La valeur de y est:40000...
>>> # repr() peut échapper des caractères spéciaux dans les chaînes de caractères
... hello = 'bonjour, exemple\n'
>>> hellos = repr(hello)
>>> print(hellos)
'bonjour, exemple\n'
>>> # L'argument de repr() peut être n'importe quel objet Python
... repr((x, y, ('Google', 'Example')))
"(32.5, 40000, ('Google', 'Example'))"

Voici deux façons d'afficher un tableau de carrés et de cubes :

>>> for x in range(1, 11):
...     print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ')
...     # Notez l'utilisation de 'end' dans la ligne précédente
...     print(repr(x*x*x).rjust(4))
...
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125
 6  36  216
 7  49  343
 8  64  512
 9  81  729
10 100 1000

>>> for x in range(1, 11):
...     print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))
...
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125
 6  36  216
 7  49  343
 8  64  512
 9  81  729
10 100 1000

Note :Dans le premier exemple, les espaces entre les colonnes sont ajoutés par print().

Cet exemple démontre la méthode rjust() de l'objet chaîne, qui justifie une chaîne à droite et ajoute des espaces à gauche.

Il existe des méthodes similaires, telles que ljust() et center(). Ces méthodes n'écrivent rien ; elles retournent simplement de nouvelles chaînes.

Une autre méthode, zfill(), ajoute des zéros à gauche d'un nombre, comme montré ci-dessous :

>>> '12'.zfill(5)
'00012'
>>> '-3.14'.zfill(7)
'-003.14'
>>> '3.14159265359'.zfill(5)
'3.14159265359'

L'utilisation de base de str.format() est la suivante :

>>> print('{} website: "{}!"'.format('Example Tutorial', 'www.example.com'))
Example Tutorial website:"www.example.com!"

Les accolades et les caractères qu'elles contiennent (appelés champs de format) seront remplacés par les arguments de format().

Les nombres dans les accolades servent à désigner la position de l'objet transmis à format(), comme montré ci-dessous :

>>> print('{0} and {1}'.format('Google', 'Example'))
Google and Example
>>> print('{1} and {0}'.format('Google', 'Example'))
Example and Google

Si des arguments nommés sont utilisés dans format(), leurs valeurs feront référence aux arguments portant ce nom.

>>> print('{name} site web : {site}'.format(name='Tutoriel d'exemple', site='www.example.com'))
Site web de Tutoriel d'exemple : www.example.com

Les arguments positionnels et nommés peuvent être combinés arbitrairement :

>>> print('Liste de sites {0}, {1} et {other}.'.format('Google', 'Exemple', other='Taobao'))
Liste de sites Google, Exemple,et Taobao.

!a(En utilisantascii()), !s(En utilisantstr()) et!r(En utilisant repr()) peut être utilisé pour convertir une valeur avant de la formater :

>>> import math
>>> print('La valeur de la constante PI est approximativement : {}.'.format(math.pi))
La valeur de la constante PI est approximativement :3.141592653589793。
>>> print('La valeur de la constante PI est approximativement : {!r}.'.format(math.pi))
La valeur de la constante PI est approximativement :3.141592653589793。

Un:facultatif et un spécificateur de format peuvent suivre le nom du champ. Cela permet un meilleur formatage de la valeur. L'exemple suivant arrondit Pi à trois décimales :

>>> import math
>>> print('La valeur de la constante PI est approximativement {0:.3f}.'.format(math.pi))
La valeur de la constante PI est approximativement3.142。

In:Passer un entier ensuite garantit que le champ est au moins aussi large que ce nombre de caractères. C'est utile pour rendre les tableaux plus jolis.

>>> table = {'Google': 1, 'Example': 2, 'Taobao': 3}
>>> for name, number in table.items():
...     print('{0:10} ==> {1:10d}'.format(name, number))
...
Google     ==>          1
Exemple     ==>          2
Taobao     ==>          3

Si vous avez une chaîne de format très longue et que vous ne voulez pas la diviser, il est judicieux de formater par nom de variable plutôt que par position.

La façon la plus simple est de passer un dictionnaire, puis d'utiliser des crochets[]pour accéder aux clés :

>>> table = {'Google': 1, 'Example': 2, 'Taobao': 3}
>>> print('Example: {0[Example]:d}; Google: {0[Google]:d}; Taobao: {0[Taobao]:d}'.format(table))
Example: 2; Google: 1; Taobao: 3

Vous pouvez également obtenir la même fonctionnalité en utilisant**avant la variable table :

>>> table = {'Google': 1, 'Example': 2, 'Taobao': 3}
>>> print('Exemple: {Example:d}; Google: {Google:d}; Taobao: {Taobao:d}'.format(**table))
Example: 2; Google: 1; Taobao: 3

Ancien formatage de chaînes

%L'opérateur peut également effectuer un formatage de chaîne. Il interprète l'argument de gauche comme une chaîne de format de stylesprintf(), remplace l'argument de droite, puis renvoie la chaîne formatée. Par exemple :

>>> import math
>>> print('La valeur de la constante PI est approximativement : %5.3f.' % math.pi)
La valeur de la constante PI est approximativement :3.142。

Comme str.format() est une fonction relativement récente, la plupart du code Python utilise encore l'opérateur %. Cependant, comme ce formatage à l'ancienne finira par être supprimé du langage, str.format() devrait être utilisé plus souvent.


Lecture de l'entrée clavier

Python fournitla fonction intégrée input()pour lire une ligne de texte depuis l'entrée standard ; l'entrée standard par défaut est le clavier.

Exemple

#!/usr/bin/python3

str = input("Veuillez saisir : ");
print ("Le contenu que vous avez saisi est : ", str)

Cela produit le résultat suivant correspondant à l'entrée :

Please enter: Example  
The content you entered is: Example

Lecture et écriture de fichiers

En Python, les opérations sur les fichiers s'effectuent via laopen()fonction. Cette fonction renvoie un objet fichier pour les opérations de lecture ou d'écriture ultérieures.

open()La syntaxe de base est la suivante :

open(filename, mode)
  • filename:Le chemin (chaîne) du fichier à accéder.
  • mode:Le mode d'ouverture du fichier, utilisé pour spécifier comment lire ou écrire (comme en lecture seule, écriture, ajout, etc.). Ce paramètre est facultatif, avec la valeur par défautr(en lecture seule).

Les modes d'ouverture de fichier courants sont les suivants (il est recommandé de se concentrer sur la maîtrise de r / w / a) :

Mode Description
r Ouvre le fichier en mode lecture seule (mode par défaut). Le fichier doit exister et le pointeur de fichier est au début.
rb Ouvre le fichier en format binaire pour un accès en lecture seule (comme les images, les vidéos, etc.). Le pointeur de fichier est au début.
r+ Ouvre le fichier en mode lecture-écriture. Le fichier doit exister et le pointeur de fichier est au début.
rb+ Ouvre le fichier en format binaire pour la lecture et l'écriture. Le pointeur de fichier est au début.
w Ouvre le fichier en mode écriture seule. Si le fichier existe, il seratronqué; s'il n'existe pas, un nouveau fichier sera créé.
wb Ouvre le fichier en format binaire pour l'écriture seule. Si le fichier existe, il sera tronqué ; s'il n'existe pas, un nouveau fichier sera créé.
w+ Ouvre le fichier en mode lecture-écriture. Si le fichier existe, il sera tronqué ; s'il n'existe pas, un nouveau fichier sera créé.
wb+ Ouvre le fichier en format binaire pour la lecture et l'écriture. Si le fichier existe, il sera tronqué ; s'il n'existe pas, un nouveau fichier sera créé.
a Ouvre le fichier en mode ajout. Si le fichier existe, le contenu écrit sera ajouté à la fin ; s'il n'existe pas, un nouveau fichier sera créé.
ab Ouvre le fichier en format binaire pour l'ajout. Le contenu écrit sera ajouté à la fin ; s'il n'existe pas, un nouveau fichier sera créé.
a+ Ouvre le fichier en mode lecture-écriture. Le pointeur de fichier est à la fin par défaut (mode ajout) ; s'il n'existe pas, un nouveau fichier sera créé.
ab+ Ouvre le fichier au format binaire pour la lecture et l'écriture. Le pointeur de fichier est à la fin par défaut ; s'il n'existe pas, un nouveau fichier sera créé.

Explication :Ajouterbaprès le mode signifie opérer sur le fichier en mode binaire, souvent utilisé pour traiter des fichiers non textuels tels que des images et de l'audio.

Le diagramme suivant résume bien ces modes :

Mode r r+ w w+ a a+
read + + + +
write + + + + +
Créez + + + +
Écraser + +
Pointeur au début + + + +
Pointeur à la fin + +

L'exemple suivant écrit une chaîne dans le fichier foo.txt :

Exemple

#!/usr/bin/python3

# Ouvrir un fichier
f = open("/tmp/foo.txt", "w")

f.write( "Python is a very good language.\nYes, it really is very good!!"\n" )

# Fermer le fichier ouvert
f.close()
  • Le premier argument est le nom du fichier à ouvrir.
  • Le deuxième paramètre décrit comment le fichier sera utilisé. mode peut être 'r' si le fichier est en lecture seule, 'w' uniquement pour l'écriture (un fichier existant portant le même nom sera supprimé), et 'a' pour l'ajout au fichier ; toutes les données écrites seront automatiquement ajoutées à la fin. 'r+' sert à la fois à la lecture et à l'écriture. Le paramètre mode est facultatif ; 'r' sera la valeur par défaut.

À ce stade, ouvrez le fichier foo.txt, qui s'affiche comme suit :

$ cat /tmp/foo.txt 
Python 是一个非常好的语言。
是的,的确非常好!!

Méthodes des objets fichier

Les exemples restants de cette section supposent qu'un objet fichier appelé f a déjà été créé.

f.read()

Pour lire le contenu d'un fichier, appelez f.read(size), qui lit une certaine quantité de données puis la renvoie sous forme de chaîne ou d'objet bytes.

size est un paramètre numérique facultatif. Lorsque size est omis ou négatif, tout le contenu du fichier sera lu et renvoyé.

L'exemple suivant suppose que le fichier foo.txt existe déjà (il a été créé dans l'exemple ci-dessus) :

Exemple

#!/usr/bin/python3

# Ouvrir un fichier
f = open("/tmp/foo.txt", "r")

str = f.read()
print(str)

# Fermer le fichier ouvert
f.close()

Après l'exécution du programme ci-dessus, la sortie est :

Python 是一个非常好的语言。
是的,的确非常好!!

f.readline()

f.readline() lit une seule ligne du fichier. Le caractère de nouvelle ligne est '\\n'. Si f.readline() renvoie une chaîne vide, cela signifie que la dernière ligne a déjà été lue.

Exemple

#!/usr/bin/python3

# Ouvrir un fichier
f = open("/tmp/foo.txt", "r")

str = f.readline()
print(str)

# Fermer le fichier ouvert
f.close()

Après l'exécution du programme ci-dessus, la sortie est :

Python 是一个非常好的语言。

f.readlines()

f.readlines() renvoie toutes les lignes contenues dans le fichier.

Si le paramètre facultatif sizehint est défini, il lit la longueur d'octets spécifiée et divise ces octets en lignes.

Exemple

#!/usr/bin/python3

# Ouvrir un fichier
f = open("/tmp/foo.txt", "r")

str = f.readlines()
print(str)

# Fermer le fichier ouvert
f.close()

Après l'exécution du programme ci-dessus, la sortie est :

['Python 是一个非常好的语言。\n', '是的,的确非常好!!\n']

Une autre façon consiste à parcourir un objet fichier, puis à lire chaque ligne :

Exemple

#!/usr/bin/python3

# Ouvrir un fichier
f = open("/tmp/foo.txt", "r")

for line in f:
    print(line, end='')

# Fermer le fichier ouvert
f.close()

Après l'exécution du programme ci-dessus, la sortie est :

Python 是一个非常好的语言。
是的,的确非常好!!

Cette méthode est simple, mais elle n'offre pas un très bon contrôle. Comme les mécanismes de traitement des deux sont différents, il est préférable de ne pas les mélanger.

f.write()

f.write(string) écrit string dans le fichier, puis renvoie le nombre de caractères écrits.

Exemple

#!/usr/bin/python3

# Ouvrir un fichier
f = open("/tmp/foo.txt", "w")

num = f.write( "Python est un très bon langage.\nOui, c'est vraiment très bien !!\n" )
print(num)
# Fermer le fichier ouvert
f.close()

Après l'exécution du programme ci-dessus, la sortie est :

29

Si vous souhaitez écrire quelque chose qui n'est pas une chaîne, vous devrez d'abord le convertir :

Exemple

#!/usr/bin/python3

# Ouvrir un fichier
f = open("/tmp/foo1.txt", "w")

value = ('www.example.com', 14)
s = str(value)
f.write(s)

# Fermer le fichier ouvert
f.close()

Après avoir exécuté le programme ci-dessus, ouvrez le fichier foo1.txt :

$ cat /tmp/foo1.txt 
('www.example.com', 14)

f.tell()

f.tell() est utilisé pour renvoyer la position actuelle de lecture/écriture du fichier (c'est-à-dire la position du pointeur de fichier). Le pointeur de fichier représente le décalage en nombre d'octets depuis le début du fichier. f.tell() renvoie un entier indiquant la position actuelle du pointeur de fichier.

f.seek()

Si vous souhaitez modifier la position actuelle du pointeur de fichier, vous pouvez utiliser la fonction f.seek(offset, from_what).

f.seek(offset, whence) est utilisé pour déplacer le pointeur de fichier à la position spécifiée.

offset représente le décalage par rapport au paramètre whence. La valeur de from_what : si elle vaut 0, cela signifie le début ; si elle vaut 1, cela signifie la position actuelle ; 2 signifie la fin du fichier. Par exemple :

  • seek(x,0) : déplace de x caractères depuis la position de départ, c'est-à-dire le premier caractère de la première ligne du fichier.
  • seek(x,1) : signifie déplacer x caractères vers l'arrière depuis la position actuelle.
  • seek(-x,2) : signifie déplacer x caractères vers l'arrière depuis la fin du fichier.

La valeur par défaut de from_what est 0, c'est-à-dire le début du fichier. Un exemple complet est donné ci-dessous :

>>> f = open('/tmp/foo.txt', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5)     # Se déplacer vers le sixième octet du fichier
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2) # Se déplacer vers le troisième octet depuis la fin du fichier
13
>>> f.read(1)
b'd'

f.close()

Dans les fichiers texte (ceux ouverts dans des modes sans b), le positionnement est uniquement relatif à la position de départ du fichier.

Lorsque vous avez fini de traiter un fichier, appelez f.close() pour fermer le fichier et libérer les ressources du système. Si vous essayez d'appeler à nouveau le fichier, une exception sera levée.

>>> f.close()
>>> f.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ValueError: opération d'E/S sur un fichier fermé

Lorsqu'on manipule un objet fichier, utiliser le mot-clé with est une très bonne approche. Une fois terminé, il fermera correctement le fichier pour vous. C'est aussi plus court à écrire qu'un bloc d'instructions try-finally :

>>> with open('/tmp/foo.txt', 'r') as f:
...     read_data = f.read()
>>> f.closed
True

Les objets fichier possèdent d'autres méthodes, telles que isatty() et truncate(), mais celles-ci sont généralement moins couramment utilisées.


Le module pickle

Le module pickle de Python implémente la sérialisation et la désérialisation de base des données.

Grâce à l'opération de sérialisation du module pickle, nous pouvons enregistrer les informations d'objet en cours d'exécution dans un programme dans un fichier pour un stockage permanent.

Grâce à l'opération de désérialisation du module pickle, nous pouvons recréer à partir d'un fichier l'objet enregistré par le programme précédent.

Interface de base :

pickle.dump(obj, file, [,protocol])

Avec cet objet pickle, vous pouvez ouvrir le fichier en mode lecture :

x = pickle.load(file)

Remarque :Lire une chaîne à partir du fichier et la reconstruire en l'objet Python d'origine.

file:Un objet de type fichier, avec les interfaces read() et readline().

Exemple 1

#!/usr/bin/python3
import pickle

# Utiliser le module pickle pour enregistrer l'objet de données dans un fichier
data1 = {'a': [1, 2.0, 3, 4+6j],
         'b': ('string', u'Unicode string'),
         'c': Aucune}

selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)

output = open('data.pkl', 'wb')

# Sérialiser le dictionnaire avec le protocole 0.
pickle.dump(data1, output)

# Sérialiser la liste avec le protocole le plus élevé disponible.
pickle.dump(selfref_list, output, -1)

output.close()

Exemple 2

#!/usr/bin/python3
import pprint, pickle

# Utiliser le module pickle pour reconstruire l'objet Python à partir d'un fichier
pkl_file = open('data.pkl', 'rb')

data1 = pickle.load(pkl_file)
pprint.pprint(data1)

data2 = pickle.load(pkl_file)
pprint.pprint(data2)

pkl_file.close()
Autres extensions