Comment Lire et écrire des données textuelles en Python

Tous les programmes doivent gérer des entrées et des sorties. Par exemple, vous devez lire ou écrire des données texte, éventuellement dans différents encodages de texte tels que ASCII, UTF-8 ou UTF-16.

Utilisez la fonction open() avec le mode rt pour lire un fichier texte. Par exemple:

# Lire le fichier entier comme une seule chaîne de caractères
with open('fichier.txt', 'rt') as f:
   donnee = f.read()

# Itérer sur les lignes du fichier
with open('fichier.txt', 'rt') as f:
   for ligne in f:
      # traitement de la ligne
      ...

 

De même, pour écrire dans un fichier texte, utilisez la fonction open() avec le mode wt, en effaçant et écrasant le contenu précédent (le cas échéant). Par exemple:

# Ecrire des morceaux de données textee
with open('fichier.txt', 'wt') as f:
   f.write(texte1)
   f.write(texte2)
   ...

# Instruction print redirigée
with open('fichier.txt', 'wt') as f:
   print(ligne1, file=f)
   print(ligne2, file=f)
   ...

 

Pour ajouter du texte à la fin d’un fichier existant, utilisez la fonction open() avec le mode at. Par défaut, les fichiers sont lus/écrits en utilisant l’encodage de texte par défaut du système d’exploitation, comme définit avec dans sys.getdefaultencoding().

Sur la plupart des machines, ce paramètre est réglé sur utf-8. Si vous savez que le texte que vous lisez ou écrivez est dans un encodage différent, fournissez une valeur pour le paramètre optionnel d’encodage de la fonction open(). Par exemple:

with open('fichier.txt', 'rt', encoding='latin-1') as f:
   ...

 

Python comprend plusieurs centaines d’encodages de texte possibles. Cependant, certains des encodages les plus courants sont ASCII, Latin-1, UTF-8, et UTF-16. UTF-8 est généralement un pari sûr si l’on travaille avec des applications Web. ASCII correspond aux caractères de 7 bits dans la plage U+0000 à U+007F.

Latin-1 est une correspondance directe des bytes 0-255 aux caractères Unicode U+0000 à U+00FF. Latin-1 est un encodage qui ne produit pas d’erreurs de décodage lorsqu’il lisait un texte dont le codage pourrait ne jamais être identifié.

Lire un fichier en Latin-1 peut ne pas produire un décodage de texte complètement correct, mais cela peut quand même suffire pour en extraire des données utiles. De plus, si vous réécrivez les données par la suite, les données d’entrée d’origine seront conservées.

La lecture et l’écriture de fichiers texte sont généralement très simples. Cependant, il y a un certain nombre d’aspects subtils à garder à l’esprit. Premièrement, l’utilisation de l’instruction with dans les exemples établit un contexte dans lequel le fichier sera utilisé.

Lorsque le contrôle quitte le bloc with, le fichier sera fermé automatiquement. Vous n’avez pas besoin d’utiliser l’instruction with, mais si vous ne l’utilisez pas, n’oubliez pas de fermer le fichier explicitement avec la fonction close():

f = open('fichier.txt', 'rt')
donnees = f.read()
f.close()

 

Une autre complication mineure concerne la reconnaissance des nouvelles lignes, qui ne sont pas les mêmes sous Unix et Windows (i.e., \n versus \r\n\n). Par défaut, Python fonctionne en mode “universal newline”.

Dans ce mode, toutes les conventions de nouvelle ligne courantes sont reconnues et les caractères de nouvelle ligne sont convertis en un seul caractère \n pendant la lecture.

De même, le caractère nouvelle ligne \n est converti en caractère de nouvelle ligne par défaut du système d’exploitation en sortie. Si vous ne voulez pas cette conversion, fournissez l’argument newline=”” à la fonction open(), comme ceci:

# Lecture avec traduction en nouvelle ligne désactivée
with open('fichier.txt', 'rt', newline='') as f:
   ...

 

Pour illustrer la différence, voici ce que vous verrez sur une machine Unix si vous lisez le contenu d’un fichier texte codé sous Windows contenant les données brutes “Python est amusant!\r\n”:

>>> # Traduction de nouvelle ligne activée (par défaut)
>>> f = open('python.txt', 'rt')
>>> f.read()
'Python est amusant!\n'

>>> # Traduction de nouvelle ligne désactivée
>>> g = open('python.txt', 'rt', newline='')
>>> g.read()
'Python est amusant!\r\n'
>>>

 

Une dernière question concerne les erreurs d’encodage possibles dans les fichiers texte. Lorsque vous lisez ou écrivez un fichier texte, vous pourriez rencontrer une erreur d’encodage ou de décodage. Par exemple:

>>> f = open('exemple.txt', 'rt', encoding='ascii')
>>> f.read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.3/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position
12: ordinal not in range(128)
>>>

 

Si vous obtenez cette erreur, cela signifie généralement que vous n’avez pas lis le fichier avec l’encodage correct. Vous devriez lire attentivement les spécifications de ce que vous lisez et vérifier que vous le faites correctement (par exemple, lire les données en UTF-8 au lieu de Latin-1 ou ce qu’il faut).

Si des erreurs d’encodage sont encore possibles, vous pouvez fournir un argument d’erreurs optionnel à open() pour traiter les erreurs. Voici quelques exemples de modèles courants de traitement des erreurs:

>>> # Remplacer les caractères défectueux par des caractères de remplacement Unicode U+fffd
>>> f = open('exemple.txt', 'rt', encoding='ascii', errors='replace')
>>> f.read()
'Alan Pape?o!'
>>> # Ignorer les caractères défectueux entièrement
>>> g = open('exemple.txt', 'rt', encoding='ascii', errors='ignore')
>>> g.read()
'Alan Papeo!'
>>>

 

Si vous manipulez constamment les arguments d’encodage et d’erreurs de la fonction open() et que vous faites beaucoup de paramétrages, vous rendez probablement la vie plus difficile que ce qu’elle devrait être.

La règle numéro un avec le texte est que vous devez tout simplement vous assurer que vous utilisez toujours le bon encodage de texte. En cas de doute, utilisez le réglage par défaut (généralement UTF-8).

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here