Occurence commençant par une variable - Python

Florian -  
dachiasse Messages postés 1932 Statut Membre -
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 1932 Statut Membre 150
 
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
Florian
 
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 1932 Statut Membre 150
 
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 24281 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 585
 
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 1932 Statut Membre 150
 
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
Florian
 
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 1932 Statut Membre 150
 
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 24281 Date d'inscription   Statut Contributeur Dernière intervention   1 585 > dachiasse Messages postés 1932 Statut Membre
 
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 1932 Statut Membre 150 > yg_be Messages postés 24281 Date d'inscription   Statut Contributeur Dernière intervention  
 
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