nous sommes d'accord: il faut identifier les fichiers ".txt"
(liste_fichier est de type liste de chaines de caractères : liste des noms de fichiers à regarder: pour préciser))
-----
nous sommes d'accord: il faut identifier les fichiers ".txt"
(liste_fichier est de type liste de chaines de caractères : liste des noms de fichiers à regarder: pour préciser))
Je connais pas Python.
Ecrivez l'algorithme (en français) qui détaille votre affirmation "il faut identifier les fichiers '.txt'".
Il y a des fonctions spécifiques au fichier avec le module os.path, je vous laisse lire la doc
Je viens d'y jeté un coup d’œil, merci. Mais je suis censé pouvoir le faire sans fonctions prédéfinies (ou plutôt, si j'étais en contrôle, je n'y aurais pas accès).
@ Isis-mika
Vous n'avez pas accès à la doc, ou pas accès au fonctions de Python.
Dans le premier cas, il faut faire un sérieux effort de mémoire, dans le second cas, on vous demande de savoir réécrire la gestion de l'OS, ça me parait surprenant.
Je parie que ces fonctions s'appellent "findfirst()", "findnext()".
en contrôle, nous n'avons pour seul outil que notre tête!
Vu que je ne connais pas toutes ces procédures et que je n'ai pas accès à la doc, je suis censé me débrouiller tout seul...
heureusement, vous êtes là..
Bon, alors, écrivez l'algorithme.
Apparemment, en contrôle, vous n'avez pas de machine, donc rien ne vous empêche d'écrire
"f_truc_machin() est une fonction qui fait ça".
On en est revenu à la question de départ, et on n'a pas beaucoup avancé.
La question est claire, tu as une fonction prenant en argument un fichier, on te demande de le faire pour plusieurs fichiers dans une liste, faut arrêter la fumette, c'est quand même pas dur de poser une p... de boucle dans une fonction, non?je viens de voir que dans mon exo, a la question suivante, une fonction compte le nombre de chacune des lettres dans une liste de fichiers et cette fonction prend en argument :
Code:def p...de fonction(p...deliste): for fichier in p...deliste: fonction_precedente(fichier)
Le tri des extensions TXT ça doit être pour la suite, voir peut-être même pas...
p....deliste ? qu'est ce que c'est ? (moi je mettrais le nom de la liste non ?)
Je suis bien d'accord avec votre fonction mais je cherchais comment remplir cette liste, quels fichiers y mettre (sans créer la liste avec le nom de chacun des fichiers que j'aurais inscrits dedans)
Réfléchissez un peu, on demande une liste en paramètre
Faut rester calme avec vous...p....deliste ? qu'est ce que c'est ? (moi je mettrais le nom de la liste non ?)![]()
certes..
Toutefois, le probleme est plus long que l'on ne veut bien le croire.
En effet, il faut à la fin avoir une seule liste qui contient toutes les lettres rencontrées et non pas autant de listes que de fichiers..
C'est amusant, à vous lire, on dirait que c'est vous qui nous apprenez l'informatique.
désolé si ça donne cette impression , ça n'était pas mon intention.
Voila ce que j'ai fait:
sachant que j'ai:Code:def lettres_fichiers(liste_fichiers): liste_finale=[] for fichier in liste_fichiers: liste_finale=lettres_3(fichier)
A chaque tour de boucle, liste_finale "vaut" la liste des lettres cherchées. Seulement, je voudrais pouvoir conserver ces listes et les imbriquer de telle manière que si la lettre "a" apparaît dans deux listes, je ne puisse l'avoir qu'une seule, mais je n'arrive pas à le faire (j'ai meme fais bugger python à un moment..)Code:def lettres_3(fichier): liste = [] f=open(fichier,"r") for line in f: for char in line: if char.isalpha() and char not in liste: char=char.lower() char=table(char) liste.append(char) f.close() return liste
Merci pour votre aide
Que voulez vous faire avec liste_finale=[] ?
Pourquoi ne retournez vous rien dans votre fonction lettres_fichiers?
Avez-vous testé?
Rassembler toutes vos listes, et faites une fonction de type ensemble (fonction set en python)Seulement, je voudrais pouvoir conserver ces listes et les imbriquer de telle manière que si la lettre "a" apparaît dans deux listes, je ne puisse l'avoir qu'une seule, mais je n'arrive pas à le faire (j'ai meme fais bugger python à un moment..)
Code:>>> set(["a", "b", "c", "a", "u", "p", "b"]) {'a', 'p', 'c', 'b', 'u'}
mais justement c'est rassembler les listes qui est compliqué pour moi car à chaque nouveau tour de boucle, la liste (que liste_finale prend comme valeur) "s'efface" pour prendre en valeur la suivante (comme on est dans une boucle). De plus, moi je ne voudrais pas rassembler les lettres d'une même liste (je me suis mal exprimé) mais rassembler les lettres de toutes les listes.
ex:
['a', 'c', 'd', 'e', 'f', 'g']
['a', 'b', 'd', 'e', 'h', 'g', 's', 'v']
me donnerait: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 's', 'v']
j'avais bien compris, mais pas vous apparemment.
voila ce que j'ai essayé de faire :
avec cette fonction je devrais obtenir toutes les lettres rencontrées (vaudrait alors aplliquées set() comme vous le disiez)Code:def lettres_fichiers2(liste_fichiers): liste_finale=[0]*len(liste_fichiers) for fichier in range(len(liste_fichiers)): liste_finale=liste_finale+lettres_3(fichier) return(liste_finale)
mais une erreur se produit lors de l'execution de lettres_3(fichier) lors de la ligne "f=open(fichier,"r")" alors que cette fonction marceh bien lorsqu'elle utilisée seule ,qu'en pensez-vous ?
la voici:
avecCode:def lettres_3(fichier): liste = [] f=open(fichier,"r") for line in f: for char in line: if char.isalpha() and char not in liste: char=char.lower() char=table(char) liste.append(char) f.close() return liste
Code:def table(lettre): for cle in correspondance: if lettre in cle: return correspondance[cle] return lettre
Avez-vous mis un print pour voir la tête de votre liste_finale (à la place de return, je préfère préciser) ?
Copier la sur le forum, pour qu'on puisse voir si le résultat est déjà correct.
j'ai essayé avec 3 fichiers txt que j'ai :
liste_fichiers=["test.txt","test2.txt","test3. txt"]
voila la réponse:Code:def lettres_fichiers2(liste_fichiers): liste_finale=[] for fichier in liste_fichiers: liste_finale=lettres_3(fichier) print(liste_finale)
Code:Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> lettres_fichiers2(liste_fichiers) File "E:\info 224\tp2.essai3.py", line 86, in lettres_fichiers2 liste_finale=liste_finale+lettres_3(fichier) File "E:\info 224\tp2.essai3.py", line 18, in lettres_3 f=open(fichier,"r") OSError: [Errno 9] Bad file descriptor
désolé , j'ai fais un mauvais copié-collé: ne considérez pas la premiere fonction de mon dernier message , c'est une erreur (j'ai en fait repris la premiere du message #78 en remplaant le return par un print()
Avant de travailler avec les fichiers travaillez avec les listes, à l'interpréteur si je simule ce que vous avez fait
On voit bien que ce n'est pas la solution, vos 0 n'ont rien à faire là...Code:>>> liste_finale = [0] * 5 >>> liste_finale [0, 0, 0, 0, 0] >>> liste_finale + ["a", "b"] [0, 0, 0, 0, 0, 'a', 'b']
Pour ajouter une liste à une liste, on utilise la méthode append, vous l'avez déjà vu!
Ensuite c'est simple de récupérer toutes les lettres dans une liste que je nomme result par exempleCode:>>> liste_finale = [] >>> liste_finale.append(["a", "b"]) >>> liste_finale [['a', 'b']] >>> liste_finale.append(["c", "b"]) >>> liste_finale [['a', 'b'], ['c', 'b']]
Puis de faire un setCode:>>> for liste in liste_finale: ... for char in liste: ... result.append(char) ... >>> result ['a', 'b', 'c', 'b']
Code:>>> set(result) {'a', 'c', 'b'}
ok merci je vais essayer vous redirais si j'y arrive
J'y suis arrivé , merci.
J'ai encore une question sur laquelle je loque :
"essayez de faire une analyse sur les bigrammes (couples de lettres).
bigrammes les plus fréquents:
es : 3.15%
le : 2.46%
en : 2.42%
de : 2.15%
re : 2.09%
nt : 1.97%
on : 1.64%
te : 1.63%
er : 1.63%
se : 1.55%
Écrivez la fonction frequences_bigramme correspondante :
avant , on étuidait les caracteres un par un mais la , comment identifier certaines lettres, et qui plus est, des couples de lettresCode:def frequence_bigrammes(liste_fichiers): """calcule la frequence des bigrammes dans les fichiers donnés en argument. paramètre : liste_fichiers, de type liste de chaines de caractères : liste des noms de fichier qu'il faudra utiliser pour l'analyse valeur de retour : dictionnaire où les clés sont des caractères, et les valeurs sont leurs fréquences d'apparition. """
je voulais tester au début si la lettre testée était l'une des bigrammes ci-dessus ( celle des gauche) et rajouter une condition pour la lettre suivante mais je n'y arrive pas , auriez-vous une idée ?
Merci beaucoup
Bonjour,
il y a plusieurs méthodes pour faire ça. Voici la méthode de hachage, la plus élégante à mon avis et certainement la plus rapide.
Voici comment ça marche pour 2 lettres.
On appelle L1 et L2 deux lettres successives
Il n'y a pas un seul if. Le mot-clé utilisé généralement est switch(L) et pour chaque cas; case 'e':Code:Suivant la lettre L1 c'est un a: suivant la lettre L2 c'est un e: on incrémente le compteur ae et on sort c'est un f: on incrémente le compteur af et on sort etc. fin de test sur L2 on sort c'est un n: suivant la lettre L2 c'est un e: on incrémente le compteur ne et on sort c'est un s: on incrémente le compteur af et on sort etc. fin de test sur L2 on sort etc. fin de test L1
Il y a plusieurs avantages à cette méthode, bien qu'elle paraisse prendre beaucoup de place (nombre de lignes) elle est très rapide en exécution, et il est très facile de rajouter des cas nouveaux, et de se vérifier.
Comme Dlzlogic, je choisirais la méthode de hachage, dans le cas de python, on utilise les dictionnaires
On pourra utiliser la méthode count des chaînes de caractères pour compter le nombre de bigrammes.
Code:>>> liste = ["espagne", "esquimau", "tes"] >>> for string in liste: ... string.count("es") ... 1 1 1
ok, je vais essayer avec de cette façon, merci
(merci a Dzlogic pour sa technique qui était tes claire aussi , mais plus longue)
N'oublie pas d'initialiser le nombre de bigrames à 0 dans ton dictionnaire, c'est ton compteur de bigrames
Code:>>> bigrames = ["es", "le", "en", "de", "re", "nt", "on", "te", "er", "se"] >>> dico = {} >>> dico.fromkeys(bigrames, 0) {'on': 0, 'le': 0, 'de': 0, 're': 0, 'en': 0, 'se': 0, 'te': 0, 'nt': 0, 'es': 0, 'er': 0}
je voulais commencer comme ceci:
mais je me rend compte que ça ne va pas..Code:def frequence_bigrammes(liste_fichiers): for fichier in liste_fichiers: f=open(fichier,"r") liste=f.readlines() for couple in liste: couple.count("es")
voila ce que j'aurais voulu commencer , m'ais c'est tres long et peu probable que ce soit correct:
qu'en pensez-vous ?Code:def frequence_bigrammes(liste_fichiers): bigrames = ["es", "le", "en", "de", "re", "nt", "on", "te", "er", "se"] dico = {} dico.fromkeys(bigrames, 0) {'on': 0, 'le': 0, 'de': 0, 're': 0,'en': 0, 'se': 0, 'te': 0, 'nt': 0, 'es': 0, 'er': 0} for fichier in liste_fichiers: f=open(fichier,"r") liste=f.readlines() for i in range(len(liste)): if liste[i]==biogrames[0]: dico[biogrames[0]]=dico.fromkeys(biogrames,1) if liste[i]==biogrames[1]: #....jusqu'à biogrames[9]