Aller au contenu

📑 Lire un fichier

Le Projet Gutenberg est une bibliothèque en ligne regroupant les versions numériques d'ouvrages libres de droits. On y a récupéré le fichier des Fables de la Fontaine au format txt.

La fonction open

Ouvrir un fichier avec Python est simple. On utilise la fonctionopen présente dans la bibliothèque native.

Cette fonction prend plusieurs paramètres. Retenons les trois suivants (déroulez pour avoir des détails):

file : le nom du fichier

Le nom du fichier (avec son extension donc, au format str).

Attention, par « nom » on désigne l'adresse du fichier. Cette adresse peut-être :

  • absolue, depuis la racine du disque, C:/home/nico/Documents/donnees_en_table/fables.txt par exemple ;

  • ou relative, depuis le fichier Python qui ouvre le fichier, fables.txt par exemple si les deux fichiers sont dans le même dossier.

On conseille très fortement d'utiliser des adresses relatives.

mode : le mode d'ouverture

Le mode d'ouverture du fichier (au format str).

On peut retenir les modes suivants :

Caractère Signification
'r' ouvre en lecture, en mode texte
'w' ouvre en écriture, en effaçant le contenu du fichier
'a' ouvre en écriture, en ajoutant les données à la fin du fichier
'b' mode binaire

On notera que le mode 'w' efface directement le contenu du fichier, il n'y a pas de message d'avertissement !

encoding : l'encodage utilisé

Le type d'encodage (au format str).

L'encodage d'un fichier correspond à la façon dont le programme qui l'ouvre doit interpréter les données qu'il contient.

Un fichier est stocké en machine sous forme d'une succession de bits. Dans la table ASCII initiale, 7 bits représentent un caractère. Dans la table ASCII étendue, il faut 8 bits pour représenter un caractère. L'encodage 'utf-8' est plus subtil : les caractères « courants » (l'alphabet latin par exemple) sont codés sur 8 bits, les caractères moins « courants » sur 16 voire 24 bits.

Changer l'encodage lors de l'ouverture d'un fichier ne modifie pas les données contenues dans le fichier mais la façon de les lire.

Par exemple les bits 010100110110100101101101011100000110110001100101001000000111010001100101011110000111010001100101 lus :

  • avec l'encodage 'utf-8' donnent 'Simple texte',

  • avec l'encodage 'utf-16 LE' donnent '楓灭敬琠硥整' !

L'encodage le plus classique pour nous sera 'utf-8'.

La fonction open peut être utilisée de deux façons :

  • utilisation classique, on ouvre et on ferme le fichier :

    fichier = open(file="fichier.txt", mode="r", encoding="utf-8")
    # Traitement du fichier
    fichier.close()
    

    Techniquement, on devrait même utiliser un try ... except au cas où le fichier est inaccessible :

    try:
        fichier = open(file="fichier.txt", mode="r", encoding="utf-8")
        # Traitement du fichier
        fichier.close()
    except IOError:  # Le fichier est inaccessible
        print("Le fichier est inaccessible")
    
  • utilisation avecwith, il est inutile de fermer le fichier et de gérer les erreurs, c'est automatique :

    with open(file="fichier.txt", mode="r", encoding="utf-8") as fichier:
        # Traitement du fichier
    

On utilisera la seconde méthode.

Lire le fichier, des lignes, une ligne !

Une fois le fichier ouvert, on peut réaliser différentes actions. Si l'objet renvoyé par open s'appelle fichier, on peut :

  • fichier.read() : lit la totalité du fichier. Renvoie une unique chaîne de caractères.
  • fichier.readlines() : lit la totalité du fichier ligne par ligne. Renvoie la liste contenant les différentes lignes.
  • fichier.readline() : lit la prochaine ligne du fichier. Renvoie une chaîne de caractères.
Écrire ?

Si le fichier est ouvert en mode écriture, on peut écrire en faisant fichier.write("texte à écrire").

Attention toutefois à ne pas écraser le contenu du fichier !

Les deux scripts ci-dessous sont donc équivalents :

with open(file="fichier.txt", mode="r", encoding="utf-8") as fichier:
    contenu = fichier.readlines()
contenu = []
with open(file="fichier.txt", mode="r", encoding="utf-8") as fichier:
    for ligne in fichier:
        contenu.append(ligne)

La seconde permet toutefois de traiter précisément chaque ligne lue. On l'utilisera préférentiellement.

Des cigales et des fourmis

Nous sommes donc équipés pour ouvrir et lire nos fichiers.

Lire les fables de la Fontaine

Le fichier contenant les fables de la Fontaine est nommé fables.txt, il est situé dans le même dossier que le fichier Python manipulé par l'éditeur. Il est encodé en utf-8.

Compléter le script afin d'ouvrir ce fichier et charger ses différentes lignes dans une liste.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013,f]xgSa.:3/mocbPrhdwitsy(24e-k8 [n=puv1)l050t0C0w0h0v0P0x0G0o0P0h0x0x0J010w0v0K010406050x0L0m0m0h0r0y040g0n0P0L0*0n0I050l0;0?0^0`0/0K04131a051d0l1d1f1a0/0t0v0M0Y0!0$0(0s0v0f0s0P1t0s0w0-050T0p0P0C1o0#0%011s1u1w1u0w1C1E1A0w0p0n0t0`1B0r1b0w0s0Y0}0x0K0h0I0(0A011G1q010c0V0C0I0h0m0C1A1(1*1/1I1=1E1^1`0-0a0G0q0r0n0K0n0x0v100I0G0R1$0r0r0C0o2f131}0I1b0l1!2s0w1Y1X1Z0t1 0(1w0I1@2c1A1l1n0Z1H2C0v2E0I1U1m1A0K2l1b2q2s2W0:1)2g2K1:2P0r0@0P0-0N2p2!0.2Z1~2$1I2(2*0-0A2.1*2:2q2B012^0h2+040k2|2r0/2 2?0(32340B372s2T0C2s2I2v0t2z300o1U1{1b3l1e2U2;2r3g053q0R2V2!300I0-0c0h1D0C0x3g0G3x300n0-0J3N3P3b010,040H0d3g393E3W0E0-0u2e0s3U3a1p2@0p0-2a1@3z3:2L3X0-0z3`3(3;3c3H1?402=42013R043T142/3V480x1-041;3J1E0x0i0w0e1z462#483Y0b3/413|3G040m3r4s3Q3S4E3W4h0-010r014H4u0-4w4d2}3O3{2%0-1@3B2N0f4O3|4a4c2Y4V1I4J4j0 0c0D0F4N4S3y4+0(3Y0O4x473|3*040#4}4t4z440o1s0C0r4$1:3Y0j3$0G5g4U4y1:500c0n5a4@045i4~4W041M2E533Q0u0-2N5x3W4A1=570v595b1I5d5f5h5N4f55043I3K3M5p5P1:4a0i5J43510K0K1@0t5!3}043 5V4_310-5v0C5+4{3$133B3j1c3w0l3u2t3n132w2v1T1V2v4l5}601m2:600S0U0W04.

On obtient la liste suivante :

fables = [
    'FABLES DE LA FONTAINE\n',
    '\n',
    'I\n',
    '\n',
    'LA CIGALE ET LA FOURMI.\n',
    '\n',
    '\n',
    'La cigale, ayant chanté\n',
    "Tout l'été,\n",
    ...
]

Le '\n' que l'on observe à plusieurs reprises est le caractère de retour à la ligne. On peut le supprimer en faisant ligne.strip(). En effet, la méthode strip supprime les caractères « blancs » au début ou à la fin d'une chaîne de caractères.

La lecture du fichier devient alors :

fables = []
with open(file="fables.txt", mode="r", encoding="utf-8") as fichier:
    for ligne in fichier:
        ligne_propre = ligne.strip()  # suppression des \n
        fables.append(ligne_propre)

On obtient :

fables = [
    'FABLES DE LA FONTAINE',
    '',
    'I',
    '',
    'LA CIGALE ET LA FOURMI.',
    '',
    '',
    'La cigale, ayant chanté',
    "Tout l'été,",
    ...
]
Relire les fables de la Fontaine

On a supprimé les caractères de retour à la ligne mais il reste désormais des lignes vides dans la liste fables.

Compléter le script afin d'ouvrir ce fichier, charger ses différentes lignes non vides dans une liste.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013,f]xgSa.:!3/mocbPrhd_witsy(254e-k8 [n6=puv1)l050u0F0y0h0x0T0z0J0p0T0h0z0z0N010y0x0O010406050z0P0n0n0h0s0A040g0o0T0P0.0o0L050m0^0`0|0~0?0O04171e051h0m1h1j1e0?0u0x0Q0$0(0*0,0t0x0f0t0T1x0t0y0;050X0q0T0F1s0)0+011w1y1A1y0y1G1I1E0y0q0o0u0~1F0s1f0y0t0$110z0O0h0L0,0C011K1u010c0Z0F0L0h0n0F1E1,1.1?1M1_1I1|1~0;0a0J0r0s0o0O0o0z0x140L0J0V1*0s0s0F0p2j17210L1f0m1(2w0y1$1#1%0u230,1A0L1{2g1E1p1r0%1L2G0x2I0L1Y1q1E0O2p1f2u2w2!0@1-2k2O1@2T0s0{0T0;0R2t2(0=2%222*1M2,2.0;0C2=1.2@2u2F012|0h2/040l302v0?332`0,36380E3b322(343h0;0D3k3d3m3f350o2-370;0M3k1g2Y172M2z0u2D340p1Y1 1f3F1i3D2$182?053K0V2Z3t1t2{0;0c0h1H0F0z3k0J2^2)3Z0,0o0;0N3+3-340:040K0d3r3^3u0H0;0w2i0t3@3e3/350q0;2e1{3B472P013`0B4e3Y4g0L3#1`4k2_483;043?3S313 480z1;041^3%1I0z0i0y0e1D4q3.4g3`0b464l2+0;0n3L4L344t4v2$4f1@4A0;010s014W3u4O4Q4r4m0;1{3V2R0f4,4s3=4`4g4%4C130c0G0I4+4w2v4y4N0;0S4/4M1@41040)5c3n4o0p1w0F0s4}1@3`0j3r0J5u3,4#1M5f0c3w5i3u4n041Q2I5C4s0w0;2R5I4;041_5l0x5n5p1M5r5t5v5Y584S5F1x2I0v2X2e2p5N1@4Y5-3!5$0f5H563X4:5.0;0i5U3g0;0z2A0/5~4h0;0B5b5^065Y5Z5x0,5f0x0c5:5 5=5(5*2X0F6i014t0k4Z2?5w4R1M4 01554!6w0,5W696b6G6v5`5;3$3(3*5^5!1M4t5}6O6d350;0h0O0O1{0u644i645E5G0F5)2d6n6$5a3~0m3V0F2w6n2w3O2x3H172A2z1X1Z2z4E6@3E1q2@0m0V0X0Z0z04.

Comptons les moutons

Nous avons donc récupéré l'ensembles des fables dans une liste contenant toutes les lignes. Nous pouvons désormais faire des requêtes sur cette liste.

Combien de vers contiennent le mot "mouton" ? Pour le savoir on fait :

moutons = [vers for vers in fables if "mouton" in vers.lower()]  # tous les vers contenant "mouton"
print(len(moutons))  # le nombre de vers

Astuce

On passe le vers en minuscule avec vers.lower() afin de trouver en une seule passe les chaînes "mouton", "Mouton", "MOUTON", etc

Requêtes dans les fables

Compléter le script ci-dessous afin d'effectuer les requêtes demandées.

Toutes les recherches de chaînes de caractères seront insensibles à la casse (utiliser vers.lower() comme ci-dessus).

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013f]gSa.3/9mocbPrhd_)èwi;tsy(25q4e7î8k j[n6=puv10l050r0G0y0f0w0W0z0L0m0W0f0z0z0Q010y0w0R010406050z0S0k0k0f0p0A040e0l0W0S0;0l0O050i0{0}0 110_0R041a1h051k0i1k1m1h0_0r0w0T0)0+0-0/0q0w0d0q0W1A0q0y0@050!0n0W0G1v0,0.011z1B1D1B0y1J1L1H0y0n0l0r111I0p1i0y0q0)140z0R0f0O0/0C011N1x010b0$0G0O0f0k0G1H1/1;1_1P1|1L1 210@0a0L0o0p0l0R0l0z0w170O0L0Y1-0p0p0G0m2m1a240O1i0i1+2z0y1)1(1*0r260/1D0O1~2j1H1s1u0*1O2J0w2L0O1#1t1H0R2s1i2x2z2%0`1:2n2R1`2W0p0~0W0@0L0U2w2+0^2*252-1P2/2;2?0C2_1;2{2x2I01300f2=040L0h342y0_372~0/3a3c0L0F3g362+383m2?0D3q3i3s3k390l2:3b2?0P3x2|2,1w2 3C313d0H3H3j3K3l3M3E3d0J3Q3z3S3B3D3n0j3Y2}3!3u040U0V3)3J2S3#3N0U2^1b2`3y3*3=3,0U333`353|3;2.3U3c0U3f423h3I3t470@0U3p4b3r3}463$4g3w4j444e4n3-3G4q4d3A3 3P4w3R3~4f3-3X4j1j2#1a2P2C0r2G380m1#221i4L1l4J2)4H4Q0Y2$3Z3=0m0U0@030L1D0z0y0G0s0U1-0O0;1~0y4,0G0(0T0G0p0(0r1;0(1L0E0S0G0W0L0f0R1:0p0f0I4`0+0)0q5f2L0L010k0l1618013:3t0@4-4/4;3q0L4x3!0l0@0Q5A5C3=0?040N3q5I2.0@4~505H4C1`0K0@0b3C5T4$5P045R0z5!4l1P0l0v0@2U5*452 5X0f1K4|5;385W040w0b5{3A0z1@045o5q0y5s615D5.5~194j5B5U5?5%4 5)4H6h0/5E040g5N6n395w5-4 6s5#1P5K0B0t0c3x4r3A4(4*4,0w4.4:0C4?4^4@4{4}6k2o534{56585a5c0 5f5h0f5j5l1M010m1A3b225u4y5w6L5y412%6g6z6o5F6a5J0@5M6m6}6u6j5S6f5O1P5}5Y0p705$5(7f5,6c5:796t0O5@5_6l6{7a0/5}5 7i0/630@6-6/1X7x015-5/6e7s7n5Q6k6y5+6~6q7N5=3l6v0v6x747O016B6D6F7t6-4)044+5x4:0h6P0w4_6S0L5(6V0O540G6Y595b5d5f0-7;1L0(0m5k0I2L0(7B0d6:1^0Z5n5Y0S2:0w5t4B757o047,0s4a7J756p5G7m755K732)7K777r2`6|7Y7c5Z8w7Y8n7h8J7S7F7k7I8E7%8n0b5^837E7v608N387z656.8b7D8#3A7G6d7E8L7M7X8O6p6r8?5v8o6w7e8`3A7!7E8.1;0r7E8%1{5q8i8k8s7Y8.7l9c8O8;788A8t0@8_9k8K7U7W9o8O7!6E4q6G3!6I7*6K6M0s0F7/824|7?6U0W180d511M0D0)6$2u0u2s0(5q0L0R158D438T6@9C4i9g388u7E8y7R8{8M9*3A8H8~9=3+7L9j8S6t9e8R358F9h7p8X8,3!8Z8:0n5w1~9/900@0Bad9`8Cah71040t920@020d0y0x8v9_3=0k8j044p9s385K9v2%069x4%7)7+6^4:9P4Q4@7:6R839I507^7`0z7|9V2n160$6L1MaS0d0S0$1L210y0(0B01an8l9p8oaL0saA9}9l04aua}7Y9.8 ai9;b18O9@8:9{9!2ya29+8Qba048V7q8Y5/8!av1`0z7)00010092bga63~bbak1`aD7$6t9zaK9C0P9FaR9H2W0k9N0(bja5aF7%bF0L0B0$840l0k0R4/6R7.0m9R0y9T9H9W9Y0S0(8e0z184`1~0L0~0Mb:0m0S1La?bS8B8p4vbo5,6 bxbB72bA6ib6a17%b9c9cd8=c66obwcl76bQ5`ci7ubma9aba02y7%6Bcc7Tajb4alc1b79+aparat7Eax0@8rcH8-6c94bhcecy9~9mcB760S5c9r2`czafcGcfcXa b0c,8mbzcEca04aE3{1a4Z0G2z2!c}4K1t4M2C2E2A1!1$2C8Wd00i4L0_dc0Z0#0%04.