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

Pour ouvrir un fichier avec Python, on utilise la fonction open présente dans la bibliothèque native.

Paramètres

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'.

Utilisation
Ouverture du fichier

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

open & close

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 plutôt 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")
with open (à privilégier)

Avec with, 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
Lecture du fichier

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 ligne par ligne. Renvoie une chaîne de caractères.

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.

Écriture

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

Attention à ne pas écraser le contenu du fichier !

Activité 1 - Lire les fables de la Fontaine

Un 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)
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

.128013tûCèlOJH1Q2à/vygj.]TswE9huq«MUiVPé[-NdmrA=»fbG)DI êe:,8Rnp(!aSoF3Lk_?î4z;cx050M0!0b0-0F0f0v0Y0}0f0-0v0v0Q010b0F0*010406050v0A0N0N0-0O0p040.0/0f0A1f0/0)0Y020-0N0*0|0Y0(0!1p0O0B0A0!0v050n1m1o1q1s1k0*04051X1Q1!0n1X1k0M0F0o17191b1d0z0F0q0z0f1=0z0b1i05120T0f0!1-1a1c011;1?1^1?0b1~201|0b0O1Y0b0z171v0v0*0-0)1d0l01221/010S140!0)1D0!1|2l2n2s242v202y0N2A040a0Y0H0O0/0*0/0v0F1y1A102j0O0O0!0}2V1Q2C0)1Y0n2h2+2e2g2f1}0M2E1d1^0)2x2S1|1*1,18232^0F2`0)0/2~1|0*2!1Y2)2+3c1l2m1A302t350O1p0f1i0j2(3g1j3f2D3i243k3m1i0l3q2n3s2)2@013x0-3n040;3B2*1k3E3v1d3H3J0`3M2+390!2+2~2.0M2g2?3Q010}362K0 1+1Y3X3b3r3V053+103=3u1.3w1i0S0-1 1O3V0Y3t3h3}1d0/1i0Q44463F1h040J0t3V3O3g3F0?1i0w2U0z4d3P483G0T1i2Q2x3@4u31014g0+4B4m3)0)3 2w4H3|4D4a044c1R3?4C2t0v2q04021M0/0b0|40420v0s0b0~0b4!0A4$0|4N474D4g0$4t4I4v4K040N3,4@3F4Q4S3e4V244X1i4:4=0O5c4%533)4`4|4O3j1i2x3_330q5h4v555s4D5a4Z4#4%1x0S0K0%5f4?4T3C4e5i1i0V5k4^2t4o041a5N3F4 2v0}1;0!0O5v2t4g0#4k0Y5*45581d5Q0S0/5!5H2*5,4}4D4 282`5T3)0/0w1i335~4~4L5X0F5Z5#245%5)5+6e5J65044)201P5?3{5O244Q0s6a3R1i0-0*0*2x0M6s4E1i4G6m6g5`1i5|0!6A4g5M6m1k0n3_3Y1#3a1Q3!1Q0b3$6W2;2,41203Z3/1W6n3F2!0N0@400?0!0@0z0;1i1I1K1M1O0Y5(6E1%3s101214163)1f4g3O1n1K1s0x0b0Y2x1m2U210^2(7b1U3s1X0g1A0/0T1f2x7f190Y1^0v0b217i0o2n7C6~1#721+3F261@1_1{3:6T3e6E6Q6+4J3 6$436m5^5l6p4b644_1i0J6A0v0j5b030;0y0|0=0P0Y0d0X0U0P0=0x0Y0x0u0Y7_0Y0:0g0E0(0D0X6r6E5-010v2K090)7.7:4Z7=7@6K1i4{7#6F4W8n028p5G575_4W8j8l8f8C598x8z8r048t3c7$6o1d7/7;7?8A4U8H8R8E8m8T8q8G7%1d5j8u8g8S8o8U0=0-171=3I0!0$0Y0-0p7G170z7G0I7.8Z8%8Q8h8J8U8L8N3r8P3F5x5F0u0/1x7z8y8U0I0b0I9a5I8,938B8(8h4Y5F997*8w8#0|0.212e9h7F0Y5:0O7f0M0I2R0A0O0o1N921i8k8!8.8$9t958*8O8v8I9B0k0A2n2?7y0T0F8i9I9i0o2x1N6 9Z9d9s8W9u8-9k9Y9~9!8s9z9(9X0|0H1a0Y0A1A8i0A0f0Y6x1f7f510O0}0!0-0A9T049V949d97a29q8X6B8Ma68Rax0|0W21510A5X219h0Y2X9@3l9:8iaq8e9{3)8i9U8FaW4va08Kav5KaC8+aAa%8U0x0f208`a;8;0}0O680O9I1D336Ja)a$9}az9 aF9ya,b59B0d0z0!0{7z8;5:9P0N0F0Y0v8;0o0/9:a 9p2*9%8YaZ9Wa18Vb4a4a+9$8,aF8:aia`8}2X1wbk390Z7C5=a#5wb3btbE9Bb7bDa-aF9*0!0f6|0Y0q0O131A9Oa|1m0T2T7B69b1bSbwb^9Aa8bX9bbu9v5b5z0|0h0A0v1Mby0mbfbl130v1z0Y350A9@a;0!9`a39|b`bR4W9wc3b~3C9caXaF0h21boc6ai135Z138_bLaO2U0Kb$20bs7Wb2cpcncxbWb{6ba5b8959ec30P7F0)7xby0-0/0c0b8_5:bk0Mc*0)0F3mcOc0aYata!cSa$cs4;5gcV8)cXbYb9a80Xc(0I0ObO7g7f39330}1g3IaVc b_c}bxa(cqcWbCb 8,d14=bGbhaRcgby1OdgabbN7Cc60!bzbUa-bTcP5wdxd3dsd5ducvc{dR0|0ddD7B7zcace1A51330M2!aO0I401xcmbAcodpd4c15yd2dLdP5$d6dvbZ9)1Na}bqbd0KcB16aq0Y7C1E768 0A0M7ld`c|audT96cUeo9#e2d8by0WcKcM21caao2a211J39addI8i0s0K0Kasendnb|bycu5@c{aF0L0A2Udf0Y0r9ha|ca0b9h7f9@2yc(eMc~d@cTb}d`esdWbVa8cz8~7Gcd8_2`0Yead/0*199:0!eJeLeldOeTeqeOdtcOcwd0c2d}0G9heg7G680{0,eZdDaeeW169J7fcdf7e.7.dYeR04fh5waF0i0I0Y9/2xfr0M2n8ibe1p337Ce,0bdme:cQd_eoa.aydM9u4g4j6N1Q7V6S6R0n3!6*0=213^3,7M1_281`2Be3e=f$fbe_eQ707V0Yb(0f00cf7t8i9Qezai1w2T0!9P162!dh8i16dE7z210}1q0-2$0ed.2X2!e(9P0Yca7y6I0s0Y7raigl7x7D0A6wa`2Ja|2xe6bmc(456Qf|277Pg09u5{1=5}d`6q6A4 7Ba`0*8L0+6M7T7VgJ0x1A0!0S0S11cH8;0N9m0zf{f`2X3)7Nf~7Qc0g:2e1g3@6P3,fF1mgRc^216k17gwgy2!160CfL190)0}160R8`0Ad/0T9iaNgGbg33aO00adgu8 0_f0haht0bgz1O8e1(1Z04bG202$9P210MhF5W5Ya|100o68gY3I5;166 h!2~g#7O29387S3?7Uhlhf7Y4*aD015ucY4f7,f,3c4l9u5Q4q2hi90)4x044ze/f)bB6Deo5V4Mg-7)eldY6jhY4-4/cte?e1e^aA4 51106Aibf$dY5eiGeriIeS8g4 5o365qiOiziQfj4=5B5D9xiH04g_et955Q5Sic7X6i0F67b@iU04d?3N6f8g5/5;im6Hg+b0d7956062irfFi6i`i|bQfedUj01j6ej2iKj70q2`0@392Q2!i9iPi;5Ujrg,eog.d`hgg=g@i:cvfG2t0}8n03blgQ3X1b0Fcf1016eN3C06jo5+jgiC6ljE1ifYisjB5R6w6yg@g/jC6=jv3X8LjK3Nf.i51%6Tf=6)h#gL7t7vgYh{7K2 4vhcg%7R6R7T3ef/8g4g7-elbF7`7|7~80828486888a8c0sg6i~fgfca8kBjkaBkDg58zkGfZ7+dViWg1bybGdj0q8@8_8{8}5X90kMj.a*kJa-dY9g9i0fby9m9oi-kCi9f%9C9E2Pcibg5;9L9Ne#9R0!k$d ffk@b!9+0)9-8;9/9;0S9?9^cll4c0e@kQeu8zaa16adblglahajeXamaoaqljkliVjfkK8UaH0YaJaL0YaNaP5Zbj1bap0AkAdrkHlllDkR8za:a=3I7ya_a{a}bj2`lAaAlVjMa7bybbbdcbdAbjccf1bp2T2`0$l,f*lCl/aE9BbGdhbJhqeWbHbO5Zm0bBk)ln8Ub#b%e5b*b,aie#jRb;9:bPmeidkPlW9 dYc5c70Ac9cbbm9:cfchcj200#k=lUm2kEbye{f22ma{cG7zma1*0bcLckl lTkNe0mwm3d{5Fc$8}k.8zc+c-c/bpaOc?c^3Il iTmNm*mP8zda9ndd7f11bHdidk0flS98i.mgcZdYdze#l_0)d#dF16dHgl8i0|mMm(l6i^fid|4=d!8zgs0fd(cfd+lagAd:aq0bmLm~nudUnfawe42140e70{e9fmhEedeEfnei0^muk(l79BewmZeygF17117HeE0OeGnqf7eKn)4vl.n18UeVeXn7e!gEe%e)f12x7Gn}kOnQe;mQhQe}9:e cAnY9Mf4fzf8ocm)oenx5FflcCk!c(fpfr0rftjR9:9Ik~8`f6kAnNk%n~mOlE7@fJfLh?fOfQl?fTc(oac(ncf(l5dUif3r6Of/k1f;f?6U1113153sf=o;7504.
Activité 2 - 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)
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

.128013rt=flb)1 2e/vyg.:,-]8swnuph5aS(o3q!k_i46P;[cdxm050T0l0c0D0M0f0w0j0S0f0D0w0w0d010c0M0A010406050w0z0V0V0D0b0o040E0G0f0z0:0G0y050m0`0|0~100^0A04051g191j0m1g0^0T0M0n0(0*0,0.0B0M0p0B0f1x0B0c0?050Z0g0f0l1s0+0-011w1y1A1y0c1G1I1E0c0b1h0c0B0(130w0A0D0y0.0k011K1u010e0#0l0y0D0V0l1E1%1)1.1M1;1I1@1_0?0a0j0P0b0G0A0G0w0M160y0j0X1#0b0b0l0S2e191|0y1h0m1Z2r1W1Y1X1F0T1~0.1A0y1?2b1E1p1r0)1L2B0M2D0y0G2H1E0A2k1h2p2r2V0_1(2f2J1/2O0b0}0f0?0i2o2Z0@2Y1}2#1M2%2)0?0k2-1)2/2p2A012@0D2*040H2{2q0^2~2=0.31330N362}2Z2 3c0?0C3f383h3a300G2(320?0O3f1k2T192H2u0T1Y2z3p0S2P1`1h3A1i3y2X1a2.053G0X2U3o1t2?0?0e0D1H0l0w3f0j2:2!3V0.0G0?0d3%3)2 0=040R0u3m3;3p0K0?0x2d0B3:393+300g0?291?3w432K013?0F4a3U4c0y3X1=4g2;443-043/3O2|3{440w1,04020I0z0G0c0Q3Y3!0w0q0c0U0c4z4B4D4m3*4c3?0s424h2$0?0V3H4P2 4p4r2X4b1/4w0?4M4C0Q0b4-4O4s2q4u4R0?4T4?043(4)3W041?3R2M0p4!3p4$564v4x4;0Q150e0t0v5c594_040h4U4n4c3}040+5n4Q4W041;0S1w0l0b5j1/3?0r3m0j5H4~4V1M5q0e3r5t3i0?1Q2D5P570x0?2M5U444j5w0M5y0M5A5C1M5E5G5I5/4^5v5S0l0L2S292k5Z4c584|5J5o5=1x5T4|5;1M4p0q5+3b0?0w1W0;6a4d0?0F5m4|065/5:4 0.5q0M0e5|620p2D5^282S0l6u670?0J4%2.605u1M4+4y4A4.5i656p6h045F6l6n6W6I5Q5w3Z1I3$6Q5K3,0?696(61500D0A0A1?0T6g4e6g5#5?6y5`6B6-6J0.3?6k2V0^0m3R0l2r6A2r3K2s3C192v7g6#793z1q2/0m0X0Z0#0w04.
Activité 3 - 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

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)
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

.128013rt=7èflb)1 2e/vygj.]8sw9nuph5aS(o3qk_iî46P;[cdm0050U0n0c0E0M0h0w0l0T0h0E0w0w0d010c0M0B010406050w0A0V0V0E0b0q040F0H0h0A0;0H0z050o0{0}0 110_0B04051h1a1k0o1h0_0U0M0p0)0+0-0/0C0M0r0C0h1y0C0c0@050!0i0h0n1t0,0.011x1z1B1z0c1H1J1F0c0b1i0c0C0)140w0B0E0z0/0m011L1v010g0$0n0z0E0V0n1F1(1*1/1N1=1J1^1`0@0a0l0Q0b0H0B0H0w0M170z0l0Y1$0b0b0n0T2f1a1}0z1i0o1!2s1X1Z1Y1G0U1 0/1B0z1@2c1F1q1s0*1M2C0M2E0z0H2I1F0B2l1i2q2s2W0`1)2g2K1:2P0b0~0h0@0l0k2p2!0^2Z1~2$1N2(2*2,0m2/1*2;2q2B012_0E2+040l0I2}2r0_302@0/33350l0O392 2!313f2,0D3j3b3l3d320H2)342,0P3q2=2#1u2^3v2`360e3A3c3D3e3F3x360v3J3s3L3u3w3g0y3R2?3T3n040k0W3Y3C2L3U3G0k2.1b2:3r3Z3+3#0k2|3:2~3=3*2%3N350k383{3a3B3m400@0k3i443k3?3 3V493p4c3}474g3$3z4j463t3^3I4p3K3@483$3Q4c1l2U1a2I2v0U1Z2A3t0T2Q1{1i4E1j4C2Y4A4K0Y2V3S3+0T0k0@030l1B0w0c0n0L0k1$0z0;1@0c4$0n0(0p0n0b0(0U1*0(1J0J0A0n0h0l0E0B1)0b0E0N4;0+0)0C592E0l02500H0c0R0V0H16185i0A5k0R3)3m0@4%4)4+3j0l4q3T0H0@0d5B5D3+0?040S3j5J2%0@4^4`5I4v1:0K0@0g3v5U4W5Q045S0w5#4e1N0H0x0@2N5+3~2^5Y0E1I4?5=315X040M0g5|3t0w1-045r5t0T1y340n675l625E5/5 194c5C5V5@5(4_5*4A6m0/5F040t5O6s325x5.4_6x5$1N5L0G0j0u3q4k4J4Z044#5y4*0m4-4/4.4=4@6p2h4}4=505254560 595b0E5d5f1K6d0R690r6b6;5v4r5x0M4(6R6f3+6u5H6k5P6F0@5N6r6E3e5R6p705W5Y5!746y0z7c5T7i7a015.5:6j2W6l7o7k040g5_1J6q7t750/5~607e1N640@6;6?6^5j6e7n5,6t6h5;7Q5?7b6o7m2Y6y6u6w797R6z040h6B0b6D7)6G6I6K7D014Y4!4$6}5z0I6T0M4:6W0l5)6Z0z4~0n6$535557590-817A6.0N2E0(7L6a1J6;0l0Z5h7O0R5Z0A2)0M6_4u7v6|6~0L437C7#5G7H0/5L787!8A7Y7B2:7u7)5~5Z7.7V5w8O8I7p7T7s8Q7@7w7y5`8P2~8R7W017F618W63658l6@8n8s8Z7q6i8Z7w5)7/8/7$938X7,0x6C7(8/7;8}6h1*0U8Z7J668s8u8w8y8F7o8~7U9p7)917d9b31959x6{7+7-963t7;6J4j6L3T7_6O7{8C0O7 8f4?836Y2i0B154{1K0D0)6*2n0f2l9Y4$180r0l0G2N0*0A0w0j6`3!8B5z4b9t948H8?3T8K9E9_8Ya03+8T7h9}8X92a61:9r8$8-8(5^8+8Z8;900i5x1@a35K0@0Gar5%ac8M7:0@9@ad5-7K0r5l73aa3t0V0M0@9|2:7@5L9H2W069J4X6N6P7|4*9!4K4.806V8g844|866W890(180l160$6}1K8g0r0A0$1J1`0c0(0G6;aBaSai7+aY0L4iaI5E9 baas5Mav6nax8%6ya88Vbdaw9wbn5-8#90aj7Aal5:8=bq0/0w6N02030I0y0R6;bDbF5uaC7S7rbta5ay9c0@aR3;aU1:9LaX8C0P9Qa(9S2P0V9Y0(8*bv8z7)bY9.0$b,184;9W9=2h1K7~0T9$0c9(9S2i7,0z9-8q0wb^8p2g0~0s9=0T0A1Jb33;b56Q0L4obz7pbcbj7oa29Aa4biahbk7gbmcs9u7l8,2r8.9ybsbM7*b-5{cKamcK0zao7+aqcvbeaucVbo7ZaO6y5Lcjcy9qaEaG8ZaK0@8EcC949f0z9hcQcEbg6t0@7%bR8X0A569ac 9Fatc(cG7@72aHc;abbpc#ctbT3A0o4T0n2s2Tdl4D1r4F2v2y2t7zdo0o4E0_dx0Z0#0%04.