Partage
  • Partager sur Facebook
  • Partager sur Twitter

aide changer nombre et repeter la ligne

Sujet résolu
    14 octobre 2021 à 13:34:15

    bonjour:

    j'ai réussi avec mon maigre savoir à coder un script python qui enlève les chiffres dans un fichier texte

    c'est bien mais je voudrais faire mieux

    mon fichier txt

    1 gobelin

    3 hulk

    5 zombie

    avec mon script actuel, il enlève juste les chiffres devant les mots, hors j'aimerai que quand il passe à "3 hulk", il copie dans le fichier txt 2fois de plus le mot hulk

    comme ceci

    hulk

    hulk

    hulk

    et quand il y a 1, il laisse comme ca tout en enlevant les chiffres devant

    comment faire ça

    merci de votre aide

    • Partager sur Facebook
    • Partager sur Twitter
      14 octobre 2021 à 14:21:08

      Est-ce que le chiffre devant correspond au nombre de fois où le mot qui suit doit être répété ? 

      Si oui, lire le fichier ligne par ligne et chaque fois, séparer la ligne selon les espaces (split), le 1er élément correspond au chiffre/nombre (n) et le second (et potentiellement les suivants) au mot à répéter. faire une boucle de n tour(s) pour écrire le mot  n fois dans une chaine.

      A la fin, écrire la chaine dans le fichier ou afficher la chaine.

      • Partager sur Facebook
      • Partager sur Twitter
        14 octobre 2021 à 15:02:17

        merci pour vos reponse

        oui umfred, c'est ca que je veux mais désolé, je suis vraiment nul en code, cela donne quoi stp?

        mon code

        with open('/home/bobi/Desktop/cards.txt') as f:
            data = ''.join(i for i in f.read() if not i.isdigit())
            data = data.replace("SB:", "")
           
        with open('/home/bobi/Desktop/cards.txt', 'w') as f:
            f.write(data)

        donc ca enleve le chiffre devant et c'est ce que je veux mais en + je veux que le mot soit repeter selon le chiffre et on va à la ligne

        2 champion

        ça donne, on enlève 2 et on fait 2x le mot champion, à la ligne, champion

        c'est un peu compliqué pour mon petit niveau mais ça m'aiderai pour classer mes cartes :)

        j'ai cherché un peu je pense à ca

        for word, count in wordcount.items():
            if count >= 2:
                print("{} {}".format(word, count))

        du coup si le nombre vaut 2 ou + on print le "word" 1fois de plus et on a la ligne a chaque fois (mais je verux que ce soit les mots a chaque ligne)

        3 druide de la mort

        druide de la mort
        druide de la mort
        druide de la mort
        ma machine
        angel slaugh
        angel slaugh




        -
        Edité par beaudottesevran 14 octobre 2021 à 15:56:00

        • Partager sur Facebook
        • Partager sur Twitter
          14 octobre 2021 à 16:25:40

          il ne faut donc pas enlever purement le nombre mais le récupérer aussi. Je ferai un truc comme ça:

          out=""
          with open('/home/bobi/Desktop/cards.txt') as f:
             for ligne in f:
                  n,mot=ligne.replace("SB:","").split(maxsplit=1)
                  out+=mot*int(n)
          
          with open('/home/bobi/Desktop/cards.txt','w') as f:
              f.write(out)
          



          • Partager sur Facebook
          • Partager sur Twitter
            14 octobre 2021 à 16:27:46

            j'ai cherché un peu je pense à ca

            for word, count in wordcount.items():
                if count >= 2:
                    print("{} {}".format(word, count))

            du coup si le nombre vaut 2 ou + on print le "word" 1fois de plus et on a la ligne a chaque fois (mais je verux que ce soit les mots a chaque ligne)

            3 druide de la mort

            druide de la mort
            druide de la mort
            druide de la mort
            ma machine
            angel slaugh
            angel slaugh




            • Partager sur Facebook
            • Partager sur Twitter
              14 octobre 2021 à 18:11:20

              Le split efface la fin de ligne.
                      out+=(mot+"\n")*int(n)
              • Partager sur Facebook
              • Partager sur Twitter

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

                14 octobre 2021 à 18:21:36

                super merci

                mais cela me met une erreur

                 File "/home/bobi/Desktop/mpc-scryfall-master/scryfall_formatter.py", line 174
                    out+=mot*int(n)
                    ^
                IndentationError: unexpected indent
                

                j'arrive pas a voir le problème

                • Partager sur Facebook
                • Partager sur Twitter
                  14 octobre 2021 à 18:58:21

                  Je ne l'ai pas indenté. Places le à la bonne colonne.
                  • Partager sur Facebook
                  • Partager sur Twitter

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

                    14 octobre 2021 à 19:16:02

                    PierrotLeFou a écrit:

                    Le split efface la fin de ligne.
                            out+=(mot+"\n")*int(n)


                    avec le paramètre maxplit=1, on évite la suppression de la fin de ligne dans la dernière partie du split (il fait un split et ne traite pas la fin),

                    on pourrait aussi fournir le paramètre sep=' ', pour forcer à utiliser uniquement l'espace en tant que séparateur et être sûr que l'on ne supprime pas la fin de ligne.

                    split(sep=' ',maxsplit=1)

                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 octobre 2021 à 19:31:09

                      je ne comprends rien, c'est juste pour trier mes cartes...

                      je suis pas pro en coding

                      j'ai fait ça

                      out=""
                      with open('/home/bobi/Desktop/cards.txt') as f:
                         for ligne in f:
                              n,word=ligne.replace("SB:","").split(sep=' ',maxsplit=1)
                                     out+=(mot+"\n")*int(n)
                               
                       
                      with open('/home/bobi/Desktop/cards.txt','w') as f:
                          f.write(out)



                      -
                      Edité par beaudottesevran 14 octobre 2021 à 19:35:37

                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 octobre 2021 à 20:05:20

                        beaudottesevran a écrit:

                        je ne comprends rien, c'est juste pour trier mes cartes...

                        je suis pas pro en coding

                        j'ai fait ça

                        out=""
                        with open('/home/bobi/Desktop/cards.txt') as f:
                           for ligne in f:
                                n,word=ligne.replace("SB:","").split(sep=' ',maxsplit=1)
                                       out+=(mot+"\n")*int(n)
                                 
                         
                        with open('/home/bobi/Desktop/cards.txt','w') as f:
                            f.write(out)



                        -
                        Edité par beaudottesevran il y a 26 minutes

                        Bonjour.

                        Visuellement, tu as encore des problèmes avec tes indentations. Tu auras donc toujours ton message d'erreur.

                        • Partager sur Facebook
                        • Partager sur Twitter

                        PB68

                          14 octobre 2021 à 20:11:09

                          que dois je faire, je ne cherche pas à apprendre, c'est juste pour trier mes cartes, j'essaye de comprendre ce que fait les fonctions mais j'ai pas 20ans de coding dans les pattes
                          • Partager sur Facebook
                          • Partager sur Twitter
                            14 octobre 2021 à 21:41:26

                            beaudottesevran a écrit:

                            out=""
                            with open('/home/bobi/Desktop/cards.txt') as f:
                               for ligne in f:
                                    n,word=ligne.replace("SB:","").split(sep=' ',maxsplit=1)
                                           out+=(mot+"\n")*int(n)
                                     
                             
                            with open('/home/bobi/Desktop/cards.txt','w') as f:
                                f.write(out)

                            Aligne verticalement les débuts des lignes 4 et 5.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              14 octobre 2021 à 22:43:17

                              waw je pensais pas que c'etait juste ça...

                              maintenant j'ai encore une autre erreur

                              ValueError: invalid literal for int() with base 10: ''

                              si je comprends bien la valeur de int(n) n'est pas valable??

                              • Partager sur Facebook
                              • Partager sur Twitter
                                15 octobre 2021 à 0:19:30

                                Oui, tu demandes à Python de convertir en entier une chaîne vide et donc il ne sait pas quoi faire et lève donc une exception. Deux solutions :

                                • n'appelle int que sur un objet que tu es certain  d'être un entier et pas quelque chose qui n'a pas de sens,
                                • gère l'exception.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  15 octobre 2021 à 0:29:49

                                  beaudottesevran a écrit:

                                  out=""
                                  with open('/home/bobi/Desktop/cards.txt') as f:
                                      for ligne in f:
                                          n,word=ligne.replace("SB:","").split(sep=' ',maxsplit=1)
                                              out+=(mot+"\n")*int(n)
                                           
                                   
                                  with open('/home/bobi/Desktop/cards.txt','w') as f:
                                      f.write(out)

                                  Après on crée "n" et "word" mais on utilise "mot" lorsqu'on ajoute à "out". On va garder le côté anglais et je modifierai ainsi :

                                  out += (word + "\n") * int(n)



                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  PB68

                                    15 octobre 2021 à 9:11:23

                                    j'essaye de voir pour n et word

                                    mais franchement c'est dur

                                    pour n

                                    for ligne in f:
                                     n = ''.join(i for i in f.read() if not i.isdigit())
                                         
                                            n,word=ligne.replace("SB:","").split(sep=' ',maxsplit=1)
                                            out += (word + "\n") * int(n)

                                    bon si quelqu'un peut m'aider svp

                                    bon je commence a comprendre, un peu mieux, je pense avoir trouver pour n

                                      for ligne in f.readline():
                                            n = ''.join(i for i in f.read() if not i.isdigit())
                                            test = [int(x) for x in ligne.split() if x.isdigit()] 
                                            n,word=ligne.replace("SB:","").split(sep=' ',maxsplit=1)
                                            out+= (word+"\n") * int(n)
                                             




                                    -
                                    Edité par beaudottesevran 15 octobre 2021 à 9:52:34

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      15 octobre 2021 à 11:00:23

                                      tes lignes 2 et 3 ne servent à rien dans ton dernier code.

                                      Je me suis basé sur ta description du fichier texte que tu nous a donné; à savoir, une 1ère colonne avec un nombre, un espace de séparation (pas une tabulation ou autre), un 2nde colonne avec le nom de la carte.

                                      Si il y a autre chose qu'un nombre dans la 1ère colonne alors oui ça peut coincer sur ces lignes.

                                      Pour explication des lignes:

                                      for ligne in f: (f étant le "fichier" ouvert) cela parcours les lignes du fichier, ligne étant la ligne en cours de traitement

                                      n,word=ligne.replace("SB:","").split(sep=' ',maxsplit=1) : dans la ligne, on remplace 'SB:' par une chaine vide (ça vient de ton 1er code), ensuite on la coupe (split) 1 fois (maxsplit) après le 1er espace (sep), et on met la 1ère partie dans n et la 2nde dans word

                                      out+=(word+"\n")*int(n) : on convertit la chaine n en entier (pour avoir un vrai nombre), on ajoute une fin de ligne (\n) au mot, on duplique n fois le mot et on l'ajoute à la chaine out

                                      PS: je pense qu'il est inutile d'utiliser le paramètre sep=' ' et de rajouter le '\n' au mot; ça devrait aussi permettre d'éviter l'erreur "ValueError: invalid literal for int() with base 10: '' " car en mettant sep=' ', si il y a plusieurs espaces successifs, il va retourner une chaine vide  

                                      "a  b".split(sep=' ') => ["a", "", "b"]

                                      " ab".split(sep=' ') => ["", "ab"]

                                      L'erreur se produit peut-être sur les lignes qui commencent par "SB:" et qui ont ensuite un espace avant le nombre.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        15 octobre 2021 à 11:25:50

                                        c'est comme ça dans mon fichier txt

                                        1 Arid Mesa
                                        1 Blood Crypt
                                        2 Bloodstained Mire
                                        3 City of Brass

                                        et je veux que ça ressorte à la fin comme ça

                                         Arid Mesa


                                        Blood Crypt


                                        Bloodstained Mire

                                        Bloodstained Mire
                                        City of Brass

                                        City of Brass

                                        City of Brass

                                        voila, je suis une bille en coding, je veux juste ça pour mes cartes

                                        merci

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          15 octobre 2021 à 12:11:19

                                          le code mis doit alors fonctionner. A noter que l'on écrit dans le même ficher qui a été lu, donc si on lance une seconde fois le script, il ne marchera pas.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            15 octobre 2021 à 12:16:32

                                            C'est plus simple comme ça non ?

                                            with open("cards.txt") as infile, open("outfile.txt", "w") as outfile:
                                                for line in infile:
                                                    num, word = line.split(" ", 1)
                                                    for _ in range(int(num)):
                                                        outfile.write(word)
                                            

                                            J'ai pas compris pourquoi ya un replace SB

                                            -
                                            Edité par thelinekioubeur 15 octobre 2021 à 12:17:28

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              15 octobre 2021 à 13:09:02

                                              thelinekioubeur a écrit:

                                              C'est plus simple comme ça non ?

                                              with open("cards.txt") as infile, open("outfile.txt", "w") as outfile:
                                                  for line in infile:
                                                      num, word = line.split(" ", 1)
                                                      for _ in range(int(num)):
                                                          outfile.write(word)
                                              

                                              J'ai pas compris pourquoi ya un replace SB

                                              désolé mais ca marche pas


                                              IndentationError: unindent does not match any outer indentation level

                                              -
                                              Edité par thelinekioubeur il y a environ 1 heure



                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                15 octobre 2021 à 13:13:33

                                                il faut refaire les indentations, le copier-coller n'est pas toujours sans défaut (tu supprimes les espaces de début de ligne et tu refais l'indentation avec la touche de tabulation)

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  15 octobre 2021 à 13:29:23

                                                  oui je viens de voir avec sublim text sous linux

                                                  j'ai ce message maintenant

                                                    n,mot=ligne.replace("SB:","").split(maxsplit=1)
                                                  ValueError: not enough values to unpack (expected 2, got 0)

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    15 octobre 2021 à 14:39:14

                                                    Ça arrive souvent en fin de texte avec certains éditeurs
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

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

                                                      15 octobre 2021 à 14:59:26

                                                      thelinekioubeur a écrit:

                                                      tu dois avoir une ligne vide

                                                      dans mon fichier txt?



                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        15 octobre 2021 à 15:21:41

                                                        bien du coup, comment faire pour qu'il ne bug pas si il y a une ligne vide??

                                                        en+ je viens de regarder, il y en a pas....

                                                        1 Arid Mesa
                                                        1 Blood Crypt
                                                        2 Bloodstained Mire
                                                        3 City of Brass
                                                        2 Copperline Gorge
                                                        1 Forgotten Cave
                                                        1 Gemstone Mine
                                                        1 Mountain
                                                        2 Steam Vents
                                                        2 Stomping Ground
                                                        4 Wooded Foothills
                                                        4 Bloodghast
                                                        4 Cathartic Reunion
                                                        2 Conflagrate
                                                        4 Creeping Chill
                                                        2 Golgari Thug
                                                        4 Life from the Loam
                                                        4 Narcomoeba
                                                        4 Prized Amalgam
                                                        4 Shriekhorn
                                                        4 Stinkweed Imp
                                                        4 Tome Scour

                                                        en regardant mon fichier txt, ça à buggué juste à cause de la ligne 17 car il y a from...comment faire pour qu'il le lise comme du texte et non du code...

                                                        donc ca marche mais il n'apprécie pas le "from", des espaces dans le fichier, et il y a des lignes avec SB: 4 popo

                                                        et une ligne "SIDEBOARD:"



                                                        -
                                                        Edité par beaudottesevran 15 octobre 2021 à 15:33:56

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        aide changer nombre et repeter la ligne

                                                        × 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