📑 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 :
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.
.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.
.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).
.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.
# Tests
(insensible à la casse)(Ctrl+I)