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
Bonjour,

Je suis débutant sur Python et je souhaiterai finaliser le code sur lequel je travail, je sens que je touche au but mais je n'arrive pas à trouver l'erreur...

En bref, je souhaite créer un code me permettant de compter le nombre de chiffres commençant par le chiffre renseigné.

Une fois le nombre d'occurence total trouvé le renvoyer avec le numéro associé.

Ensuite, augmenter ce chiffre de +1 et calculer a nouveau le nombre d'occurence commençant par ce dernier chiffre.

Voici ce que j'ai commencé à faire :

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


Configuration: Macintosh / Safari 13.1.2



Le résultat que j'obtiens :

39 , 4
40 , 0
41 , 0
42 , 0
43 , 0
44 , 0
45 , 0
46 , 0
47 , 0
48 , 0
49 , 0

Le résultat souhaité :

39 , 4
40 , 3
41 , 8
42 , 3
43 , 1
44 , 0
45 , 2
46 , 9
47 , 11
48 , 4
49 , 7

Merci d'avance.
EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

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
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) ?
0
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
0
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
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 :
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 += 1
Logiquement, 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
0
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
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
0
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
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.
0
Hey,

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()
0
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
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.
0
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
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.
0
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
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.
0