Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de fichier ou de dico

Sujet résolu
    12 janvier 2021 à 17:29:07

    Bonjour! 

    J'ai un petit soucis avec un programme.

    Le but de ce programme est de scanner un document HTML issus de page web, pour en extraire les URL et ensuite scanner chaque URL pour en extraire les textes, et faire de ces textes une liste de mots.

    Ensuite, chacun de ces mots est ajouté à une liste principale (un dictionnaire pour être précis) qui est chargée depuis un fichier de sauvegarde, et à chaque mot est associé un indice de récurrence: Si le mot ne faisait pas encore partie de la liste, il est tout simplement ajouté, et si il en faisait déjà partie, on ajoute +1 à la récurrence de ce mot

    Le but à terme est d'obtenir une liste de mots triés dans l'ordre décroissant de récurrence d'utilisation sur les sites qui ont été scannés.

    Aucun soucis, tout fonctionne impeccablement, sauf que la liste principale (avec les indices) ne s'actualise pas entre deux utilisations: Lorsque je lance 2 fois mon programme, en lui donnant la même URL, les indices de chaque mot devraient en principe doubler, mais là la liste reste identique.

    Voici le programme:

    dans le main:

    #initialisation du site web ciblé, récolte des URL de  la page
    
    Pages = Page("https://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Accueil_principal")
    URLS = Pages.URLs_Page()
    URLS = [i for i in URLS if i] 
    NbUr = len(URLS)
    TextePlus = []
    Texte_Tri = Trier()
    
    print(NbUr, "URL trouvées, patientez...")
    
    #rassemblement des textes de toutes les pages dans une liste
    
    for numURL in range(0, 100):
    
    	if "https://fr." in URLS[numURL]:
    
    
    		PageWeb = Page(URLS[numURL])
    		TextePage = PageWeb.Texte_Page()
    		TextePlus = TextePlus + TextePage
    
    #Le texte obtenu est injecté dans un objet Tri pour être transformé en liste
    
    Texte_Tri.Texte = TextePlus
    ListeMots = Texte_Tri.TexteListe()
    
    #Initialisation du dico (récupération des données depuis un fichier dico.txt)
    
    dictionnaire = Trier("dico.txt")
    dictionnaire.Init_D()
    
    #Ajout des mots de la liste dans le dico et incrémentation des indices
    
    for mot in ListeMots:
    
    	if mot in dictionnaire.Dico:
    		dictionnaire.Dico[mot[:-1]] += 1
    	else:
    		dictionnaire.Dico[mot[:-1]] = 1
    
    
    
    with open("dico.txt", "w+",  encoding="utf8") as di:
    	for k,v in dictionnaire.Dico.items():
    		moind = k.replace('\n', '')+">"+ str(v) + '\n'
    		di.write(moind)
    



    voici à quelle méthode correspond la ligne "dictionnaire.Init_D()", c'est là que le dico prend les valeurs du fichier de sauvegarde du dico. :


    	def Init_D(self):
    
    		if self.NomFichier != 0: 
    			isFile = os.path.isfile("D:/CODE/Python/TriMots/" + self.NomFichier)
    			if isFile == True:
    				fich = open(self.NomFichier, "r", encoding="utf8")
    
    				for lignes in fich:
    					lignecl = lignes.replace('\n', '')
    					MotIndice = lignecl.split('>')
    					MotIndice = [i for i in MotIndice if i] 
    					self.Dico[MotIndice[0]] = int(MotIndice[1])
    
    				fich.close()
    
    			elif isFile == False:
    				fich = open(self.NomFichier, "w", encoding="utf8")
    				fich.close()
    		else:
    			print("Le fichier n'est pas nommé!")	
    



    Dans ce fichier texte qui sauvegarde le dico, il y a un mot par ligne, suivi de son indice et séparés par le caractère ">" comme l'exemple suivant:

    classique>3

    portrait>3

    astres>3

    escalade>3

    débutez>3

    zynq->3

    créer>6

    monnaie>3

    locale>3


    Bref, puisque ce fichier est lu puis permet de remplir la variable self.Dico, et que c'est ensuite à cette variable que j'ajoute les mots de ma liste, pour enfin remplacer mon fichier par le nouveau avec les nouvelles valeurs, il devrait évoluer d'une utilisation à l'autre, mais là il se réinitialise à chaque fois, j'ai du mal à comprendre ou est l'erreur...

    Merci d'avance et désolé pour le pavé, j'espère que j'ai été assez clair, je ne possède pas toujours les termes usuels quand je parle de code vu que je suis autodidacte et néophyte. Aussi, le code est probablement loin d'être optimisé, mais mon objectif pour l'instant est de le faire fonctionner pour tester la théorie!

    -
    Edité par AlexandrePlouvier1 12 janvier 2021 à 17:32:59

    • Partager sur Facebook
    • Partager sur Twitter
      12 janvier 2021 à 18:22:44

      Il faut commencer par vérifier que le Dico lu correspond bien à ce que vous attendez (et au contenu du fichier). Puis qu'il y a bien eu des mises à jour avant d'écrire la nouvelle mouture...
      • Partager sur Facebook
      • Partager sur Twitter
        12 janvier 2021 à 18:30:08

        Puisque ton fichier semble être du texte brut, j'essaierais de le lire bêtement juste après le open ... "r" et je l'afficherais (en tout cas, le début si c'est trop long)
        Si tu ne réussis pas, il y a un problème dans la logique qui t'amène à lire. Remonte vers le début de ta méthode en affichant les variables et/ou leurr type.
        Je suppose que tu peux lire le fichier avec n'importe quel éditeur.
        • Partager sur Facebook
        • Partager sur Twitter

        Le Tout est souvent plus grand que la somme de ses parties.

          13 janvier 2021 à 12:08:29

          Ouvrir un fichier avec "w+" c'est du mode modification, donc tu n'effaces pas le contenu précédent, tu rajoutes au début de fichier les données.
          Quand tu fais la relecture du fichier, les valeurs qui restent dans Dico sont les dernières lues, donc les valeurs du 1er passage.
          Ouvre le fichier avec simplement "w" pour écraser le fichier, ou alors il faut que tu testes si la ligne contient le mot pour mettre à jour sa valeur d'occurrence.

          -
          Edité par umfred 13 janvier 2021 à 12:09:14

          • Partager sur Facebook
          • Partager sur Twitter
            13 janvier 2021 à 15:28:56

            @umfred:
            J'ai cherché dans la doc de Python sur le open(), je n'ai pas vu le "w+":
            https://www.w3schools.com/python/ref_func_open.asp
            J'ai également regardé du côté du fopen() de C. Même chose.
            Pour ajouter à la fin, on met "a".

            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

              13 janvier 2021 à 18:10:12

              dans la doc "allégée" de w3schools, ok; mais dans la doc officielle, il y a le "+" (qui peut se mettre avec w ou r ou autres)
              Edit: En c/c++ (peut-être plus en c++) => http://www.cplusplus.com/reference/cstdio/fopen/

              -
              Edité par umfred 13 janvier 2021 à 18:12:45

              • Partager sur Facebook
              • Partager sur Twitter
                14 janvier 2021 à 1:56:21

                Merci umfred pour la précision.
                • Partager sur Facebook
                • Partager sur Twitter

                Le Tout est souvent plus grand que la somme de ses parties.

                  19 janvier 2021 à 22:12:33

                  Bonjour,

                  Désolé pour le délai de réponse et merci à tous pour votre aide!!

                  J'avais oublié de préciser, mais j'avais déjà effectué des tests pour voir si le dico se constituais correctement lors de l'initialisation (a coups de print() )

                  En fait, c'est Unfred qui a trouvé la solution, l'écriture se faisait effectivement à la suite du document et non pas en remplacement! Avec un simple "w" ça fonctionne parfaitement!

                  Merci encore à tous, je peux clore le sujet!

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Problème de fichier ou de dico

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown