Occurence commençant par une variable - Python
Fermé
Florian
-
Modifié le 13 avril 2021 à 15:28
dachiasse Messages postés 1709 Date d'inscription samedi 12 septembre 2020 Statut Membre Dernière intervention 13 mai 2021 - 13 avril 2021 à 15:05
dachiasse Messages postés 1709 Date d'inscription samedi 12 septembre 2020 Statut Membre Dernière intervention 13 mai 2021 - 13 avril 2021 à 15:05
A voir également:
- Occurence commençant par une variable - Python
- Citizen code python avis - Accueil - Outils
- Numero commencant par 0806 - Guide
- Ce programme est écrit en python. il construit un mot secret dans une variable mais il ne l'affiche pas. modifiez-le pour qu'il affiche le mot secret. exécutez-le. quel est ce mot secret ✓ - Forum Python
- Excel commence par ✓ - Forum Bureautique
4 réponses
dachiasse
Messages postés
1709
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
13 mai 2021
149
10 avril 2021 à 01:59
10 avril 2021 à 01:59
Salut,
J'essaye, mais, vraiment j'essaye. J'ai RIEN compris !
"compter le nombre de chiffres commençant par le chiffre renseigné"
par exemple : 654125 : chiffre renseigné 1 : résultat 3 chiffres (125) ?
J'essaye, mais, vraiment j'essaye. J'ai RIEN compris !
"compter le nombre de chiffres commençant par le chiffre renseigné"
par exemple : 654125 : chiffre renseigné 1 : résultat 3 chiffres (125) ?
Bonjour,
Désolé on va faire passer ça sur le coup de la fatigue.
En soit je recherche dans un fichier (file.txt) qui contient :
3954
3240
4345
4041
3834
4023
Les chiffres de ce fichier, commençant par 39 soit pour cet exemple il y a 1 occurence.
Ensuite je voudrais faire une loop pour dire à mon code ok, on a vu que les chiffres commençant par 39 il y en à 1 mais combien y en a t-il qui commence par 40, le code repars et me sort cette fois-ci : 2 occurrences.
Pour que le résultat final soit :
39, 1
40, 2
41, 0
42, 1
43, 1
Explication :
Il y a 1 ligne commençant par 39 sur tout le fichier, une fois finit j'ajoute +1 à mon 39 nous avons maintenant 40 et le code tourne pour m'afficher son nombre d'occurence etc
J'espere avoir été un peu plus clair.
Merci
Désolé on va faire passer ça sur le coup de la fatigue.
En soit je recherche dans un fichier (file.txt) qui contient :
3954
3240
4345
4041
3834
4023
Les chiffres de ce fichier, commençant par 39 soit pour cet exemple il y a 1 occurence.
Ensuite je voudrais faire une loop pour dire à mon code ok, on a vu que les chiffres commençant par 39 il y en à 1 mais combien y en a t-il qui commence par 40, le code repars et me sort cette fois-ci : 2 occurrences.
Pour que le résultat final soit :
39, 1
40, 2
41, 0
42, 1
43, 1
Explication :
Il y a 1 ligne commençant par 39 sur tout le fichier, une fois finit j'ajoute +1 à mon 39 nous avons maintenant 40 et le code tourne pour m'afficher son nombre d'occurence etc
J'espere avoir été un peu plus clair.
Merci
dachiasse
Messages postés
1709
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
13 mai 2021
149
10 avril 2021 à 04:17
10 avril 2021 à 04:17
Ok, c'était l'autre idée que je me faisais mais à force de relecture, je me perdais.
Bon, c'est fourbe, ton code est logique mais il n'est pas correct en Python. Déjà, je reprends ton code avec la balise python :
Les lignes 1 et 2 sont inutiles, tu fais pareil ensuite et mieux avec with.
Je régule l'indentation (4 espaces pas 12 !) et je ne fais pas de if inline comme la ligne 13 :
Et, en fait, tu dois tester ton code. J'ai fait ça :
Voilà la méthode qui te manquait : https://docs.python.org/fr/3/library/io.html#io.IOBase.seek
Bon, c'est fourbe, ton code est logique mais il n'est pas correct en Python. Déjà, je reprends ton code avec la balise python :
fh = open("file.txt") fhread = fh.readlines() with open("file.txt") as fh: number = 39 occurrences = 0 while number < 50: findz = str(number) for line in fh: findz = str(number) if line.startswith(findz): occurrences +=1 print(findz, ",", occurrences) number = number +1 occurrences = 0
Les lignes 1 et 2 sont inutiles, tu fais pareil ensuite et mieux avec with.
Je régule l'indentation (4 espaces pas 12 !) et je ne fais pas de if inline comme la ligne 13 :
with open("file.txt") as fh: number = 39 occurrences = 0 while number < 50: findz = str(number) for line in fh: findz = str(number) if line.startswith(findz): occurrences +=1 print(findz, ",", occurrences) number = number +1 occurrences = 0
Et, en fait, tu dois tester ton code. J'ai fait ça :
with open("file.txt") as fh: number = 39 while number < 41: for line in fh: print(line) number += 1Logiquement, on doit voir afficher chaque ligne du fichier 2 fois. Or, ce n'est pas le cas, parce que for line in fh agit comme un générateur. Un générateur est un itérateur particulier qui ne se remet pas automatiquement à 0, il faut le faire explicitement.
Voilà la méthode qui te manquait : https://docs.python.org/fr/3/library/io.html#io.IOBase.seek
yg_be
Messages postés
23526
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 avril 2025
Ambassadeur
1 577
10 avril 2021 à 10:32
10 avril 2021 à 10:32
bonjour,
en général, il est plus performant de lire une seule fois le fichier et de compter simultanément toutes les occurrences, sur base d'un tableau de compteurs
en général, il est plus performant de lire une seule fois le fichier et de compter simultanément toutes les occurrences, sur base d'un tableau de compteurs
dachiasse
Messages postés
1709
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
13 mai 2021
149
10 avril 2021 à 20:21
10 avril 2021 à 20:21
Salut,
Oui tu as raison. Maintenant, quand on met dans une variable (souvent une liste) le contenu d'un fichier, ce contenu va dans la mémoire vive. Si ça dépasse la quantité de mémoire vive disponible, ça va déstabiliser le programme et le faire échouer.
Dans le cas où ça ne pose pas de problème. Le mieux est, évidemment, de travailler dans la RAM et non la ROM qui est énormément plus lente.
Oui tu as raison. Maintenant, quand on met dans une variable (souvent une liste) le contenu d'un fichier, ce contenu va dans la mémoire vive. Si ça dépasse la quantité de mémoire vive disponible, ça va déstabiliser le programme et le faire échouer.
Dans le cas où ça ne pose pas de problème. Le mieux est, évidemment, de travailler dans la RAM et non la ROM qui est énormément plus lente.
Hey,
Au cas ou cela pourrait aider, j'ai réussi mon code :
Au cas ou cela pourrait aider, j'ai réussi mon code :
with open("file.txt") as fh: number = 393901 occurrences = 0 lines=fh.readlines() while number < 393941: findz = str(number) for line in lines: if line.startswith(findz): occurrences +=1 print(findz, ",", occurrences) number = number +1 occurrences = 0 fh.close()
dachiasse
Messages postés
1709
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
13 mai 2021
149
13 avril 2021 à 00:46
13 avril 2021 à 00:46
Salut,
Si mon idée de remettre le curseur au début du fichier avec la méthode seek(), ton code n'est pas optimal.
Comme le suggère yg, tu pourrais mettre le contenu de ton fichier dans une liste et travailler dedans. Et si ton fichier est plus volumineux que ta RAM, tu découpes le contenu en morceaux plus petits.
Si mon idée de remettre le curseur au début du fichier avec la méthode seek(), ton code n'est pas optimal.
Comme le suggère yg, tu pourrais mettre le contenu de ton fichier dans une liste et travailler dedans. Et si ton fichier est plus volumineux que ta RAM, tu découpes le contenu en morceaux plus petits.
yg_be
Messages postés
23526
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 avril 2025
1 577
>
dachiasse
Messages postés
1709
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
13 mai 2021
13 avril 2021 à 10:44
13 avril 2021 à 10:44
readlines() met, malheureusement, le contenu du fichier dans une liste.
au lieu d'utiliser readlines(), il est préférable, dans une boucle, d'utiliser readline().
il est en effet inutile, et contre-productif, de lire tout le fichier en mémoire.
je ne suggère pas de mettre le fichier en mémoire. je suggère de lire le fichier ligne par ligne, et, pour chaque ligne, d'incrémenter le compteur adéquat. ce qui implique d'utiliser une liste de compteurs.
au lieu d'utiliser readlines(), il est préférable, dans une boucle, d'utiliser readline().
il est en effet inutile, et contre-productif, de lire tout le fichier en mémoire.
je ne suggère pas de mettre le fichier en mémoire. je suggère de lire le fichier ligne par ligne, et, pour chaque ligne, d'incrémenter le compteur adéquat. ce qui implique d'utiliser une liste de compteurs.
dachiasse
Messages postés
1709
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
13 mai 2021
149
>
yg_be
Messages postés
23526
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 avril 2025
13 avril 2021 à 15:05
13 avril 2021 à 15:05
Salut,
Je viens de relire attentivement ton message 8. Au début, je me demandais comment compter plusieurs occurrences sur une seule lecture du ficher. Maintenant, j'ai compris et eu la même idée de créer une liste de compteurs.
Et oui, dans ce cas, inutile de placer le contenu du fichier en RAM. De plus, je suppose que python place en RAM la ligne du readline() en cours de traitement.
Je viens de relire attentivement ton message 8. Au début, je me demandais comment compter plusieurs occurrences sur une seule lecture du ficher. Maintenant, j'ai compris et eu la même idée de créer une liste de compteurs.
Et oui, dans ce cas, inutile de placer le contenu du fichier en RAM. De plus, je suppose que python place en RAM la ligne du readline() en cours de traitement.