Outils pour utilisateurs

Outils du site


nsi:premiere:fichier_texte

Ceci est une ancienne révision du document !



Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172

Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172

Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172

Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Fichier texte

Fichiers et encodages

On a déjà parlé de ASCII et Unicode – cours sur chaînes de caractères. Allons un peu plus loin en examinant les fichiers de texte.

Reconnaître un fichier texte

Un fichier en mémoire est une suite de bits, ou si on veut une suite d'octets.

Ces octets peuvent signifier n'importe quoi. On ne sait pas forcément ce qu'ils représentent à priori. Il nous faut des indices :

  • Le fichier peut avoir une extension. Le format .txt sous Windows indique qu'il s'agit d'un fichier texte.
    Chaque octet représente un caractère selon le codage ANSI de Windows, compatible avec ASCII.
    Mais cet indice ne constitue pas une preuve !
    cf. Exercice 1
  • Si on renomme en monimage.doc, l'ouverture avec Word ne fonctionnera pas.
    En effet, .doc est un format plus compliqué contenant un certain nombre d'informations placées d'une certaine façon. Si les données ne correspondent pas à ce qui est attendu, Word retourne une erreur.

On peut donc analyser le fichier selon plusieurs format connus et ne conserver que les formats compatibles.

Les encodages

Supposons que l'on ait un fichier texte, un fichier simple, contenant seulement la suite des caractères.

Donc ni un fichier '.doc' ni un fichier '.pdf' par exemple.

Il s'agit maintenant de savoir comment lire ces octets. Doit-on les considérer un par un ? par groupe de deux ? etc. Il n'y a pas un seul choix possible !

  • Il y a une histoire qui a vu les systèmes se complexifier à mesure que les performances le permettaient.
  • Il y a une inertie importante : un choix ancien – comme ASCII – demeure simplement pour assurer la compatibilité avec ce qui existe déjà et que l'inertie est parfois importante.
  • Différentes entreprises concurrentes tentent d'imposer leurs choix.
  • Des situations différentes peuvent entraîner des besoins différents et donc des choix différents.
  • Quand l'informatique ne concernait que les USA, ASCII suffisait. Mais aujourd'hui, il faut tenir compte de la grande diversité des systèmes d'écriture.

Avec internet, les échanges de fichier devient mondial. De plus certains fichiers restent accessibles pendant très longtemps. Le problème de l'encodage est donc très important.

ASCII

Déjà mentionné, 128 caractères sans accent, donc 7 bits par caractère.

Dans les fait on utilise plutôt un des codages suivants qui sont compatibles avec ASCII si bien qu'on n'utilise jamais moins d'un octet par caractère.

ISO 8859-1

Latin-1 = Europe occidentale [1986]

Ajoute des caractères accentués à ASCII. Suffit pour le français.

<img src='inc/11.iso.png'>

Tend à disparaître au profit d'UTF-8. Pas plus de 10 % d'utilisation.

<img src=“inc/11.utilisation.png”>

ANSI

Windows-1252 ou CP1252

C'est un codage Windows, très proche de ISO 8859-1.

ANSI se contente de remplacer certains codes de contrôles – octets ne correspondant pas à un caractère affichable – par des caractères.

UTF8

Universal character set Transformation Set - 8 bits

C'est un codage fait pour utiliser Unicode mais en allégeant un peu.

Avec UTF-8, selon les cas, un caractère peut-être codé sur 1, 2 ou 4 octets.

  • Quand c'est un caractère ASCII, il ne prend qu'un octet. Ainsi, un fichier en ASCII est parfaitement compatible avec UTF-8. Être compatible ASCII est quasiment obligatoire.
  • Un caractère comme é va être encodé par deux octets : 0xC3 A9.
  • L'encodage est fait pour que l'on sache à chaque fois combien on devra lire d'octets pour le prochain caractère.

Je donne ici un peu plus de détails. C'est optionnel, vous pouvez ignorer ces détails si vous n'êtes pas intéressés.

  • Quand l'octet commence par 0, UTF8 considère que la fin de l'octet, les 7 bits restants, codent un caractère ASCII.
  • Quand l'octet commence par 110, UTF8 comprend que le prochain caractère utilisera deux octets, celui-ci et le suivant. L'octet suivant devra commencer par 10, sinon ce sera une erreur.
    Par exemple, le caractère é :
    • é est codé en UTF8 0x C3 A9 = 0b 1100 0011 1010 1001
    • Le premier des deux octets commence bien par 110 et le second par 10.
    • Quand on enlève ces codes 110 et 10 (je mets des _ à la place) il reste ___00 0011 __10 1001 ce qui correspond au é en unicode : 0xE9 = 1110 1001.
  • Il y a encore d'autres codes spéciaux pour des caractères plus rares.

Exercice 11.2

Reconnaître l'encodage

Pour éviter les problèmes, le mieux est d'indiquer d'une façon ou d'une autre le codage utilisé. Par exemple avec un fichier .html :

  • Le fichier .html est un fichier texte écrit avec un certain encodage xxx.
  • Dans le fichier .html on ajoute une balise <meta charset='xxx'> dans la partie <head>.

Ainsi le navigateur ouvrant la page reconnaît la balise <meta charset> – écrite uniquement en ASCII donc compatibles avec tous les encodages – et en déduit l'encodage à utiliser.

Rien n'empêche de s'amuser à enregistrer le fichier en ISO-8859-1 puis d'écrire <meta charset='utf-8'>. Le navigateur essaiera alors d'ouvrir le fichier avec l'encodage UTF8. Des caractères spéciaux indiqueront qu'il y a des caractères non reconnus.

Exercice 11.3 et 11.4

Manipulation de fichiers

Un langage de programmation permet généralement de demander au système d'exploitation l'ouverture et la manipulation de fichier.

On se contentera pour l'instant d'ouvrir des fichiers de textes (contenant seulement une suite de caractères) qui seront suivant le cas :

  • des phrases
    exemple : on veut analyser les statistiques d'un roman. Nombres de mots, etc.
  • des données
    exemple : une suite de cotations boursières séparées par “,”

Les fichiers de données dans lesquels les colonnes sont séparées par “,” ou encore “;” sont appelés CSV pour Comma Separated Values. On leur donne l'extension .csv. Ils sont comme des fichiers tableur (Excel…) mais sans mise en forme, formule, graphique…

Ouverture de fichier en Python

f = open('nom_du_fichier', mode, encoding='utf8')
  • mode permet de sélectionner le mode d'ouverture :
    • 'r' pour lecture – read
    • 'w' pour écriture – write
    • 'a' pour ajout – add
    • 'x' pour création – erreur si existe déjà
  • encoding permet d'indiquer l'encodage à utiliser. 'utf8' est la valeur par défaut dans les versions récentes de Python – donc pas besoin de le préciser.

Manipulation des lignes d'un fichier texte

f.write("chaine de caractère") # ajoute la chaîne de caractère
                               # au fichier
f.read()      # renvoie l'ensemble du texte du fichier
f.read(n)     # renvoie les n prochains caractères
f.readline()  # renvoie la prochaine ligne
f.readlines() # renvoie l'ensemble des lignes
              # sous forme d'un tableau de chaînes.

Ces caractères sont importants :

  • '\n' : retour à la ligne
  • '\t' : tabulation

Quand on récupère une ligne de fichier texte, elle contient souvent le '\n' final ou des espaces. On peut vouloir s'en débarrasser. Ces commande sont là pour cela :

chaine.strip()  # supprime les espaces et ''%%'\n'%%'' en début et fin
chaine.lstrip() # même chose, seulement en début (left)
chaine.rstrip() # même chose, seulement en fin (right)

Et quand on récupère une ligne de fichier .csv'', par exemple : ''chaine = “Michel,Dupont,12/11/1984,3 rue de la fontaine”'' On va vouloir la fractionner sous forme d'un tableau : ''['Michel', 'Dupont', '12/11/1984', '3 rue de la fontaine']%%

Cette commande est là pour cela :

chaine.split(',')

<WRAP tip>Le genre de travail que l'on va faire a déjà été fait 1000 fois et sert d'apprentissage. Pour aller plus vite, il y aura des bibliothèques de fonctions toutes faites comme csv.

nsi/premiere/fichier_texte.1632916567.txt.gz · Dernière modification : de goupillwiki