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
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.
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
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)
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.
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
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.
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
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.
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 :
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
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.
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.
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
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
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)
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
× 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.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
PB68
Découverte Python Doc Tkinter Les chaînes de caractères
Découverte Python Doc Tkinter Les chaînes de caractères
PB68
Le Tout est souvent plus grand que la somme de ses parties.