From 5106ddd7496179215b3ba8a604e1861d98444e4a Mon Sep 17 00:00:00 2001 From: Dimitri Merejkowsky Date: Wed, 12 Feb 2020 20:02:37 +0100 Subject: [PATCH] Ajout du chapitre 15 --- .../01-données-binaires.rst | 314 ++++++++++++++++++ .../02-fichiers.rst | 101 ++++++ .../index.rst | 17 + cours/source/img/ascii-table.png | Bin 0 -> 35643 bytes cours/source/index.rst | 1 + 5 files changed, 433 insertions(+) create mode 100644 cours/source/15-fichiers-et-données-binaires/01-données-binaires.rst create mode 100644 cours/source/15-fichiers-et-données-binaires/02-fichiers.rst create mode 100644 cours/source/15-fichiers-et-données-binaires/index.rst create mode 100644 cours/source/img/ascii-table.png diff --git a/cours/source/15-fichiers-et-données-binaires/01-données-binaires.rst b/cours/source/15-fichiers-et-données-binaires/01-données-binaires.rst new file mode 100644 index 0000000..3546ea2 --- /dev/null +++ b/cours/source/15-fichiers-et-données-binaires/01-données-binaires.rst @@ -0,0 +1,314 @@ +Données binaires +================ + +Introduction : chiffres et nombres +----------------------------------- + +Si je vous parle de ce que représente le texte: ``342`` vous pouvez le +voir de deux façons: + +1. C'est une **suite de chiffres**: ``3``, puis ``4``, puis ``2``. +1. C'est un **nombre** (quelque part entre 300 et 350) + +On se sert des *chiffres* de 0 à 9 pour *représenter* des *nombres* + +La base 10 +---------- + +Plus exactement, pour passer de la suite de chiffres ``342`` au nombre, +on part de la fin, puis on ajoute chaque chiffre, multiplié par la puissance +de 10 adéquate:: + + 2 * 1 + + 4 * 10 + + 2 * 10 * 10 + +soit:: + + 2 + + 40 + + 300 + +ce qui fait bien 342. + + +La base 16 +---------- + +En informatique, on se sert souvent de la base 16. C'est le même principe: on se +sert des "chiffres" de 0 à F (A vaut 10, B vaut 11, jusqu'à F qui vaut 15) + +Ainsi, la suite ``DA2`` peut être interprétée comme suit :: + + 2 * 1 + + 10 * 16 + + 13 * 16 * 16 + +soit :: + + 2 + + 160 + + 3328 + +soit 3746 + +On appelle aussi la base 16 la base *hexadécimale*, ou *hexa* en abrrégé. + +La base 2 +---------- + +La base 2 c'est pareil, mais avec deux "chiffres" - 0 et 1. + +Ainsi, la suite `110` peut être interprétée comme suit :: + + 0 * 1 + + 1 * 2 + + 1 * 2 * 2 + +soit :: + + 0 + + 2 + + 4 + +soit 6. + + +Bits et octets +-------------- + +* Un bit (*bit* en anglais) c'est la valeur 1 ou 0 +* Un octet (*byte* en anglais) c'est une suite de 8 bits + +À retenir +--------- + +**Ces paquets de 8 ne veulent rien dire en eux-mêmes**. +Ils n'ont de sens que dans le cadre d'une *convention*. + +Par exemple, l'octet '10100100' peut être un nombre écrit en +binaire (164 en l'occurrence), mais peut avoir une toute +autre signification + +Le nombre de valeurs possible augmente *très* rapidement avec le nombre d'octets: + +* 1 octet, c'est 255 valeurs possibles (``2 ** 8``) +* 2 octets, c'est 65.536 valeurs possibles (``2 ** 16``) +* 4 octets, c'est 4.294.967.296 valeurs possibles (``2 ** 32``) + +Bases en Python +--------------- + +On se sert des préfixes `0b` et `0x` pour noter +les nombres en base binaire ou hexadécimale respectivement:: + + print(0b1110) + # affiche: 6 + + print(0xDA2) + # affiche: 3490 + +Poids des bits +-------------- + +Regardez l'example suivant:: + + x = 0b0010010 # 18 + y = 0b0010011 # 19 + z = 0b1010010 # 82 + +Notez que le premier bit est plus "fort" que le dernier on dit qu'on est en "little endian". + + +Manipuler des octets en Python +------------------------------ + +On peut construrie des listes d'octets en utilsant ``bytearray`` et +une liste de nombres:: + + data = bytearray( + [0b1100001, + 0b1100010, + 0b1100011 + ] + ) + + # equivalent: + data = bytearray([97,98,99]) + + # equivalent aussi: + data = bytearray([0x61, 0x62, 0x63] + + +Texte +----- + +On peut aussi interpréter des octets comme du texte - c'est la table ASCII + +.. image:: ../img/ascii-table.png + + +ASCII - remarques +----------------- + +* C'est *vieux* - 1960 +* Le A est pour American +* Ça sert à *envoyer* du texte sur des terminaux d'où les "caractères" non-imprimables dans la liste +* Mais c'est une convention *très* utilisée +* Techniquement, on n'a besoin que de 7 bits, mais on préfère envoyer des octets + +Utiliser ASCII en Python +------------------------ + +Avec ``chr`` et ``ord``:: + + x = chr(98) + print(x) + # affiche: b + + x = ord('a') + print(x) + # affiche: 97 + +Affichage des bytearrays en Python +---------------------------------- + +Python utilise ASCII pour afficher les bytearrays si les caractères sont "imprimables":: + + data = bytearray([97,98,99]) + print(data) + # affiche: bytearray(b"abc") + +Et ``\x`` et le code hexa sinon:: + + data = bytearray([7, 69, 76, 70]) + print(data) + # affiche: bytearray(b"\x07ELF") + +Notez bien que ce qu'affiche Python n'est qu'une *interpétation* d'une séquence d'octets. + +Types +----- + +La variable `b"abc"` est une "chaîne d'octets", de même que `"abc"` est une "chaîne de caractères". + +Python apelle ces types `bytes` et `str`:: + + print(type("abc")) + # affiche: str + + print(type(b"abc")) + # affiche: bytes + + +bytes et bytearray +------------------ + +De la même manière qu'on ne peut pas modifier un caractère à l'intérieur une string, on ne peut +pas modifier un bit - ou un octet dans une variable de type `bytes`:: + + a = "foo" + # a[0] = "f" => TypeError: 'str' object does not support item assignment + + b = b"foo" + # b[0] = 1 => TypeError: 'bytes' object does not support item assignment + +Par contre on peut modifier un bytearray:: + + b = bytearray(b"foo") + b[0] = 103 + print(b) + # affiche: bytearray(b"goo") + +Conversion bytes - texte +------------------------ + +Avec ``encode()`` et ``decode()``:: + + text = "chaise" + encodé = text.encode("ascii") + print(encodé) + # affiche: b"chaise" + + bytes = b"table" + décodé = bytes.decode("ascii") + print(décodé) + # affiche: b"table" + + +Notez que dans le deuxième exemple, on est bien en train de "décoder" +un paquet de 0 et de 1. Il peut s'écrire ainsi: + + + bytes = b"\x74\x61\x62\x6c\x65" + décodé = bytes.decode("ascii") + print(décodé) + # affiche: table + +Plus loin que l'ASCII +--------------------- + +Vous avez sûrement remarquer qu'il n'y a pas de caractères accentués dans +ASCII. Du coup, il existe d'autres *conventions* qu'on appelle "encodage". + +On peut spécifier l'encodage quand on appelle la méthode ``decode()``:: + + # latin-1: utilisé sur certains vieux sites + data = bytearray([233]) + lettre = data.decode('latin-1') + print(lettre) + # affiche: 'é' + + # cp850: dans l'invite de commande Windows + data = bytearray([233]) + lettre = data.decode('cp850') + print(lettre) + # affiche: 'Ú' + +Notez que la même suite d'octets a donné des résultats différents en fonction +de l'encodage! + +Unicode +-------- + +L'Unicode c'est deux choses: + +1. Une **table** qui associe un un "codepoint" à chaque caractère +2. Un encodage particulier, l'UTF-8, qui permet de convertir une suite + d'octets en suite de codepoint et donc de caractères + +UTF-8 en pratique +------------------ + +D'abord, UTF-8 est compatible avec ASCII:: + + encodé = "abc".encode("utf-8") + print(encodé) + # Affiche: b'abc' + +Ensuite, certains caractères (comme ``é``) sont représentés par 2 octets:: + + encodé = "café".encode("utf-8") + print(encodé) + # Affiche: b'caf\xc3\xa9" + + +Enfin, certains caractères (comme les emojis) sont représentés par pleins d'octets:: + + encodé = "I ❤️ you".encode("utf-8") + print(encodé) + b'I \xe2\x9d\xa4\xef\xb8\x8f you' + + +.. warning:: + + Toutes les séquences d'octets ne sont pas forcément valides quand on veut + les décoder en UTF-8 + +Conséquences +------------- + +* On peut représenter *tout* type de texte avec UTF-8 (latin, chinois, coréen, langues disparues, ....) +* On ne peut pas accéder à la n-ème lettre directement dans une chaîne + encodée en UTF-8, il faut parcourir lettre par lettre (ce qui en pratique est rarement + un problème). diff --git a/cours/source/15-fichiers-et-données-binaires/02-fichiers.rst b/cours/source/15-fichiers-et-données-binaires/02-fichiers.rst new file mode 100644 index 0000000..3cd14ee --- /dev/null +++ b/cours/source/15-fichiers-et-données-binaires/02-fichiers.rst @@ -0,0 +1,101 @@ +Fichiers +======== + +Ouvrir un fichier en lecture +---------------------------- + +Fichiers "textes" et fichiers "binaires" ++++++++++++++++++++++++++++++++++++++++++ + +Cela vous est peut-être déjà arrivé: Imaginons que vous ayez dans +votre répertoire courant un code source python danse ``mon_script.py`` +et un pdf dans ``cours.pdf``, + +Vous pourrez ouvrir ``mon_script.py`` dans un éditeur de texte, +mais pas ``cours.pdf`` - ou alors ça affichera n'importe +quoi. + +En Pyton, on utilise la fonction native ``open()``, en passant en argument +le chemin du fichier. + +Selon que l'on veuille accéder au *texte* dans le fichiers ou aux données +binaires qui sont à l'intérieur, on utilise l'argument ``"r"`` ou ``"rb"`` +('r' comme 'read', et 'b' comme 'binary') + +Enfin, ``open()`` renvoie un "file-objet", qu'on note souvent +'f', qui contient une méthode ``read()`` pour lire le contenu +du fichier. + +En pratique, voilà ce que cela donne:: + + f = open("mon_script.py", "r") + code = f.read() + print(code) + # affiche le code dans le fichier foo.py + + f = open("cours.pdf", "rb") + données = f.read() + # données est mainteant une grosse suite + # d'octets + + f = open("cours.pdf", "r") + f.read() + # Erreur: UnicodeDecodeError: 'utf-8' codec can't + # decode byte 0xd0 in position 10 + + +Comme on doit utilisé l'option ``rb`` pour lire le pdf, on dit parfois +que le fichier ``pdf`` est un fichier "binaire", par opposition avec +``mon_script.py`` qui est un fichier "texte". + +Ça n'a pas vraiment de sens: les deux fichiers sont stockés sur votre +ordinateur comme des suites d'octets, indépendamment de leur contenu. + +Il se trouve que l'un des deux contient une suite d'octets qui est +décodable en tant que string. En fait, sous le capot, la suite d'octets +renvoyée dans le premier example a été décodée avec l'encodage par défaut +de votre système. On peut d'ailleurs passer l'encodage en argument à +``open()``:: + + f = open("vieux_texte_en_latin_1.txt", "r", encoding="latin-1") + texte = f.read() + +Ouvrir un fichier en écriture +----------------------------- + +On peut aussi *écrire* dans un fichier, toujours avec ``open()``, +mais cette fois avec la méthode ``write()`` du file-objet. + +On peut écrire du texte avec l'option ``"w"`` et une chaîne de +caractères :: + + f = open("mon_script.py", "w") + f.write("Nouveau contenu!") + +Et écrire directement des données binaires avec ``"wb"`` et +une suite d'octets :: + + f = open("cours.pdf", "wb") + f.write(b"\x0c\x1f...") + +Encore une fois, sous le capot, la chaîne de caractères sera encodée par +Python avant d'être écrite dans le fichier texte + + +Fermeture des file-objets +-------------------------- + +Notez qu'il est impératif de fermer les fichiers que vous ouvrez - que ce soit +en lecture ou en écriture, en appelant la méthode ``close()``:: + + f = open("mon_poéme.py", "w") + f.write(premier_vers) + f.write(deuxième_vers) + f.close() + +Conseils +-------- + +* On utilise souvent le binaire pour échanger entre Python et le monde extérieur +* Tout texte a un *encodage*, et il vous faut connaître cet encodage pour travailler avec +* Si vous avez le choix, utilisez UTF-8 diff --git a/cours/source/15-fichiers-et-données-binaires/index.rst b/cours/source/15-fichiers-et-données-binaires/index.rst new file mode 100644 index 0000000..e8b23aa --- /dev/null +++ b/cours/source/15-fichiers-et-données-binaires/index.rst @@ -0,0 +1,17 @@ +Chapitre 15: Données binaires et fichiers +========================================== + +On vous a peut-être déjà dit que l'informatique consiste à +manipuler des suites de 0 et et de 1s, mais qu'en est-t-il +exactement ? + +De manière surprenante, la réponse à cette question +va nous emmener sur un chemin qui va parler +de maths, puis de comment le langage Python +peut interagir avec "l'extérieur". + +.. toctree:: + :maxdepth: 1 + + 01-données-binaires + 02-fichiers diff --git a/cours/source/img/ascii-table.png b/cours/source/img/ascii-table.png new file mode 100644 index 0000000000000000000000000000000000000000..a69af86797541d4eb831f804d1d73663f6bbd6a8 GIT binary patch literal 35643 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