You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

02-fichiers.rst 3.1 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. Fichiers
  2. ========
  3. Ouvrir un fichier en lecture
  4. ----------------------------
  5. Fichiers "textes" et fichiers "binaires"
  6. +++++++++++++++++++++++++++++++++++++++++
  7. Cela vous est peut-être déjà arrivé: Imaginons que vous ayez dans
  8. votre répertoire courant un code source python danse ``mon_script.py``
  9. et un pdf dans ``cours.pdf``,
  10. Vous pourrez ouvrir ``mon_script.py`` dans un éditeur de texte,
  11. mais pas ``cours.pdf`` - ou alors ça affichera n'importe
  12. quoi.
  13. En Pyton, on utilise la fonction native ``open()``, en passant en argument
  14. le chemin du fichier.
  15. Selon que l'on veuille accéder au *texte* dans le fichiers ou aux données
  16. binaires qui sont à l'intérieur, on utilise l'argument ``"r"`` ou ``"rb"``
  17. ('r' comme 'read', et 'b' comme 'binary')
  18. Enfin, ``open()`` renvoie un "file-objet", qu'on note souvent
  19. 'f', qui contient une méthode ``read()`` pour lire le contenu
  20. du fichier.
  21. En pratique, voilà ce que cela donne::
  22. f = open("mon_script.py", "r")
  23. code = f.read()
  24. print(code)
  25. # affiche le code dans le fichier foo.py
  26. f = open("cours.pdf", "rb")
  27. données = f.read()
  28. # données est mainteant une grosse suite
  29. # d'octets
  30. f = open("cours.pdf", "r")
  31. f.read()
  32. # Erreur: UnicodeDecodeError: 'utf-8' codec can't
  33. # decode byte 0xd0 in position 10
  34. Comme on doit utilisé l'option ``rb`` pour lire le pdf, on dit parfois
  35. que le fichier ``pdf`` est un fichier "binaire", par opposition avec
  36. ``mon_script.py`` qui est un fichier "texte".
  37. Ça n'a pas vraiment de sens: les deux fichiers sont stockés sur votre
  38. ordinateur comme des suites d'octets, indépendamment de leur contenu.
  39. Il se trouve que l'un des deux contient une suite d'octets qui est
  40. décodable en tant que string. En fait, sous le capot, la suite d'octets
  41. renvoyée dans le premier example a été décodée avec l'encodage par défaut
  42. de votre système. On peut d'ailleurs passer l'encodage en argument à
  43. ``open()``::
  44. f = open("vieux_texte_en_latin_1.txt", "r", encoding="latin-1")
  45. texte = f.read()
  46. Ouvrir un fichier en écriture
  47. -----------------------------
  48. On peut aussi *écrire* dans un fichier, toujours avec ``open()``,
  49. mais cette fois avec la méthode ``write()`` du file-objet.
  50. On peut écrire du texte avec l'option ``"w"`` et une chaîne de
  51. caractères ::
  52. f = open("mon_script.py", "w")
  53. f.write("Nouveau contenu!")
  54. Et écrire directement des données binaires avec ``"wb"`` et
  55. une suite d'octets ::
  56. f = open("cours.pdf", "wb")
  57. f.write(b"\x0c\x1f...")
  58. Encore une fois, sous le capot, la chaîne de caractères sera encodée par
  59. Python avant d'être écrite dans le fichier texte
  60. Fermeture des file-objets
  61. --------------------------
  62. Notez qu'il est impératif de fermer les fichiers que vous ouvrez - que ce soit
  63. en lecture ou en écriture, en appelant la méthode ``close()``::
  64. f = open("mon_poéme.py", "w")
  65. f.write(premier_vers)
  66. f.write(deuxième_vers)
  67. f.close()
  68. Conseils
  69. --------
  70. * On utilise souvent le binaire pour échanger entre Python et le monde extérieur
  71. * Tout texte a un *encodage*, et il vous faut connaître cet encodage pour travailler avec
  72. * Si vous avez le choix, utilisez UTF-8