Associer une ligne à un chiffre

Résolu/Fermé
lulu5111 Messages postés 13 Date d'inscription mardi 7 mars 2023 Statut Membre Dernière intervention 4 juillet 2023 - Modifié le 8 mars 2023 à 10:59
 PierrotLeFou - 11 mars 2023 à 17:30

Bonjour,

J'aimerais savoir comment ouvrir un fichier texte avec un script python de sorte à récupérer son contenu et attribuer un chiffre à chaque ligne. Mais il ne doit pas écrire directement dans le fichier texte.

J'ai aussi un problème, voici mon code : 

with open("C:\\Users\\Lucas\\Desktop\\data_fr.txt", "r") as data_file:
        data = data_file.readline()
        print(data)

anwser = input("recopier")

if anwser == data:
    print("good")
else:
    print("nop")

Dans mon fichier nommé data_fr il y a :

bouger
commencer

... écrit exactement pareil avec le retour à la ligne.

Lorsque mon programme lit la 1ere ligne et me la print, il met aussi le retour à la ligne, ce qui fait que si je recopie le mot, mon input est forcément faux... Comment je pourrai faire en sorte qu'il retire ce \n ?

Merci d'avance pour votre réponse,

Bonne journée
Windows / Opera 95.0.0.0

A voir également:

6 réponses

PierrotLeFou
8 mars 2023 à 01:11

Pour ton premier problème je ne suis pas certain de ce que tu veux faire.
Il me semble que c'est simple d'initialiser un compteur à 0 et de l'incrémenter juste avant ou après la lecture.
Et tu peux afficher le compteur dans le print.
Pour ton second probllème, tu as deux solutions.
Ou bien tu fais un replace de '\n' par ''
Ou bien tu ajoutes le paramètre end='' dans le print.

1
lulu5111 Messages postés 13 Date d'inscription mardi 7 mars 2023 Statut Membre Dernière intervention 4 juillet 2023
8 mars 2023 à 17:09

En fait, mon projet est de faire une app pour s'entrainer à apprendre du vocabulaire en anglais. Pour cela il va récupérer un mot dans un fichier (data_fr) et sa traduction dans un autre (data_en).

J'aimerai qu'il nous donne un des deux mots aux hasard et qu'il nous demande sa traduction (donc son équivalent dans l'autre fichier).

C'est pour ça que mon idée était que le programme donne un chiffre à chaque ligne (non visible dans le print) et que donc il associe la 1ere ligne du fichier fr à celle du en et ainsi de suite.

0
PierrotLeFou
11 mars 2023 à 17:30

liste_aleatoire est une liste, pas un nombre.
On l'initialise comme suit:
liste_aleatoire = []   # Une liste vide.

1
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 8 mars 2023 à 10:25

Bonjour,

Pour afficher les lignes en les numérotant, tu peux faire ça:

with open('C:\\Users\\Lucas\\Desktop\\data_fr.txt') as f:
    for n, ligne in enumerate(f, 1):
        print('{} : {}'.format(n, ligne[:-1]))
0
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
8 mars 2023 à 11:05

Bonjour,

Tu peux écrire ceci :

with open("data_fr.txt", "r") as f:
    data = [
        line.strip()
        for line in f
    ]
print(data)

... et si tu veux ignorer les lignes blanches :

with open("data_fr.txt", "r") as f:
    data = [
        line.strip()
        for line in f
        if line.strip()
    ]
print(data)

Exemple :

(mando@silk) (~) $ cat data_fr.txt 
bouger

commencer

(mando@silk) (~) $ python3 toto.py 
['bouger', 'commencer']

 Bonne chance

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PierrotLeFou
8 mars 2023 à 18:52

Je ne suis pas certain que ce soit une bonne idée de séparer la version française et la version anglaise sur un autre fichier.
Suppose que tu ajoutes un mot en français et que tu oublies la traduction anglaise, ou que tu la places au mauvais endroit,
que se passera-t-il selon toi?
Si tu choisis le mot français avec un numéro (ou le nom).
L'idée est de compter jusqu'à l'endroit désiré en comparant le compteur avec la valeur désirée et de sortir de la boucle.
Ensuite, tu pourrais faire la même chose avec le dictionnaire anglais.
Tu comptes les lignes (ou mots) lues et tu t'arrêtes quand tu as atteint la ligne désirée.
attendue = ... ligne désirée ...
actuel = 0
while True:
    # lire la ligne
    actuel += 1
    if actuel == attendu:
        break

0
lulu5111 Messages postés 13 Date d'inscription mardi 7 mars 2023 Statut Membre Dernière intervention 4 juillet 2023
Modifié le 11 mars 2023 à 15:46

Ok super, j'ai réussi à un peu avancer, j'ai demandé à mon programme de lire une ligne aléatoire mais j'aimerai faire en sorte qu'il ne lise pas 2 fois la même ligne.

voici ce que j'ai fait : 

import linecache
import random

randomline = random.randint(1,2)
print(randomline)


data = linecache.getline("C:\\Users\\Lucas\\Desktop\\data_fr.txt", randomline)
data = data.replace("\n", "")
print(data)

anwser = input("recopier : ")

if anwser == data:
    print("good")
else:
    print("nop")

En fait ce que je pensais faire c'était que lorsque qu'il générait un chiffre aléatoire, il aille vérifier que ce n'est pas un nombre qu'il à déjà fait et qu'il en regénère un nouveau. Mais je ne sais pas trop comment faire ça...

Merci d'avance pour votre aide

0
PierrotLeFou
11 mars 2023 à 17:05

Chaque fois que tu génères un nombre aléatoire, tu l'insères dans une liste initialement vide avec append.
Ensuite tu peux boucler en vérifiant si le nombre est dans la liste:
nouveau = ... valeur aléatoire ...
while nouveau in liste_aleatoires:
    nouveau = ... nombre aléatoire ...
liste_aleatoire.append(nouveau)

0
lulu5111 Messages postés 13 Date d'inscription mardi 7 mars 2023 Statut Membre Dernière intervention 4 juillet 2023
11 mars 2023 à 17:08

J'ai fait ça :

liste_aleatoires = 0

nouveau = random.randint(1, Counter)
while nouveau in liste_aleatoires:
    nouveau = random.randint(1, Counter)
liste_aleatoires.append(nouveau)

Mais j'ai cette erreur : 

Traceback (most recent call last):
  File "c:\Users\Lucas\Desktop\import linecache.py", line 21, in <module>
    while nouveau in liste_aleatoires:
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: argument of type 'int' is not iterable

0