[Python] Manipuler des fichers textes

Fermé
sycosis Messages postés 16 Date d'inscription dimanche 23 septembre 2007 Statut Membre Dernière intervention 15 septembre 2011 - 18 déc. 2008 à 21:13
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 19 déc. 2008 à 01:25
Bonsoir à tous,

Avant tout, je précise que je suis débutante sur Python, et en programmation en général... Mes connaissances sont loin d'être optimales !

Bref, je résume ce qui me pose problème ce soir. Je fais des études de linguistique et j'aimerais utiliser Python pour faire certains calculs sur des textes (par exemple la fréquence de certains mots, des moyennes sur le nombre de mots par phrase, etc...).

Je sais comment ouvrir un fichier texte dans Python, mais j'ai des soucis en ce qui concerne l'application d'une fonction ou d'un script au contenu de ce fichier.
Je ne sais pas s'il existe une possibilité de faire cela directement, je vous montre comment j'ai procédé :


import codecs
f=codecs.open('texte2.txt',encoding='iso-8859-1')
data=f.read()

J'ai donc essayé comme précédent en transformant le contenu de mon fichier en une chaine pour pouvoir agir dessus.
Mais j'ai l'impression que cette chaine est bien trop grosse pour pouvoir être manipulée et à chaque fois que je tente une opération dessus le mode interactif de Python plante totalement et ne répond plus... (-> par exemple un data.split() ou pour couper le texte en utilisant des motifs)

Pour avoir une idée de la longueur du genre de texte que j'utilise :
http://www.gutenberg.org/files/11494/11494-8.txt

Voilà donc je ne sais pas trop s'il y a un moyen de faire cela plus simplement sans passer par une chaine ?

En tout cas désolée d'avance si ma question vous parait simpliste mais j'avoue que j'ai cherché dans différents cours et que dès qu'il s'agit de manipulation de fichiers les tutos parlent de suite choses très complexes et non pas de simple textes... Donc il n'est pas évident de trouver une réponse

Merci d'avance pour votre aide,


Sycosis

1 réponse

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
19 déc. 2008 à 01:25
Je fais des études de linguistique et j'aimerais utiliser Python pour faire certains calculs sur des textes

Ah, qui sait, peut être notre prochaine Larry Wall :-)

Mes félicitations pour ce message nickel, c'est pas courant dans les parages, bien que le contraire d'une linguiste m'eût étonné.

Bref, venons en au fait.

En réalité ta question n'est pas bête, pourquoi ne pas agir sur le fichier directement plutôt que d'abord en retirer la chaine?
Tout simplement parce qu'un fichier n'est qu'un descripteur symbolique vers des données qui sont stockées sur un périphérique (en général un disque dur), et que pour travailler, un processeur a besoin de placer ses données en mémoire vive. Il n'est pas capable de travailler directement sur un disque.

Et c'est donc ce que fait la méthode read(): transfert disque dur -> mémoire vive. Donc tu n'as pas le choix.
Par contre l'usage de read() sans argument de longueur de lecture est réservé à des petits fichiers. Usuellement, les traitement sur de gros fichiers se font petits bouts par petits bouts.
Il y a un truc génial en python c'est l'itérateur de ligne:
f = open("monfichier, "r")

for ligne in f:
    print ligne #Va t'afficher la prochaine ligne à chaque passage dans la boucle

Ceci dit, franchement ton fichier ne fait que 348 Ko, ce qui reste raisonable. Donc tu peux garder ton read(). Le problème c'est que si tu passes par Idle, ou autre débuggeur python, le traitement est plus lourd que si tu lançais ton programme en ligne de commande.

Donc lance plutôt la bête en ligne de commande. Pour la suite je ne saurais trop te suggérer de poster ici les parties de ton code qui prennent du temps.

Le problème est peut être aussi d'ordre algorithmique, parfois certaines manières de coder sont 100 fois moins efficaces que d'autres. Donc faudrait voir avec ton code.... que tu n'hésiteras pas à poster ici bien entendu.
1