Python retour à la ligne [Résolu]

Signaler
Messages postés
4
Date d'inscription
dimanche 17 mai 2020
Statut
Membre
Dernière intervention
17 mai 2020
-
Messages postés
364
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
19 septembre 2020
-
Bonjour à tous.
Je débute en python et je ne connais aucun autre langage informatique.
Je fais une erreur que j'arrive pas à identifié sur l’exercice suivant:

Le fichier notes.txt contient les notes obtenues par des étudiants pour le cours de Python. Chaque ligne du fichier ne
contient qu’une note.
Créez un script Python qui lit chaque ligne de ce fichier, extrait les notes sous forme de float et les stocke dans une liste.
Le script réécrira ensuite les notes dans le fichier moyenne.txt avec une note par ligne suivie de « recalé » si la note est
inférieure à 10 et « admis » si la note est supérieure ou égale à 10. Toutes les notes seront écrites avec une décimale. À titre d’exemple, voici les 3 premières lignes attendues pour le fichier moyenne.txt :
1| 13.5 admis
2| 17.0 admis
3| 9.5 recalé

voici mon script:

with open("notes.txt", "r") as fichier1, open("liste.py", "w") as fichier2:
    for notes in fichier1:
        fichier2.write("{}\n".format(float(notes)))
with open("liste.py", "r") as filin, open("moyenne.txt", "w") as fichier3:
    for ligne in filin:
        if float(ligne) < 10.0:
            fichier3.write("{0}{1}\n".format(str(ligne), "recale"))            
        else:
            fichier3.write("{0}{1}\n".format(str(ligne), "admis"))


voici le résulta:

13.5
admis
17.0
admis
9.5
recale
10.0
admis
16.5
admis
8.5
recale
18.5
admis

Voulez vous m'aider à comprendre mon erreur qui fait que python retourne à la ligne après la notes.
Merci

5 réponses

Messages postés
364
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
19 septembre 2020
57
Bonjour,

Tu lis ton fichier liste.py et tu mets les lignes lues dans la variable ligne
donc à la fin de ligne, il y a forcément un \n lu dans le fichier, un retour à la ligne

IL faut donc tronquer ligne avant de l'exploiter, enlever le dernier caractère :

for ligne in filin:
    ligne = ligne[:-1] 


un fichier .py, c'est un script Python, n'appelle pas tes fichiers de données comme ça ...
Messages postés
29649
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
20 septembre 2020
6 732
Bonjour,

D'abord sur la logique, l’exercice demande de lire le fichier en entrée pour créer une liste, donc les notes doivent être chargées dans une liste mémoire liste[15,10,8,...] pas dans un fichier liste.py (d'ailleurs cette extension devrait être réservée à du code source).

Puis faire une boucle sur la liste pour créer le fichier de sortie.

Dans ton code c'est le \n qui provoque un saut de ligne, enfin peut être je ne fais pas réellement de python

Sur le forum, pour afficher du code il faut utiliser balises code. Un petit tuto là https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Au dessus de la zone d'édition de tes messages, il y a des icones pour les enrichissements du texte.
Celle qui a cet aspect <>▼ permet d'appliquer aux codes le format correspondant à sa nature.

Cdlt
Messages postés
4
Date d'inscription
dimanche 17 mai 2020
Statut
Membre
Dernière intervention
17 mai 2020

Merci pour le tuto et votre réponse.

Le \n de la ligne 3 est voulu. Vue que python lit le fichier en str() sans le retour à la ligne je ne peux pas le convertir en floa() pour la comparaison if.

Je prends note de votre remarque " les notes doivent être chargées dans une liste mémoire liste", juste que je sais pas le faire.
Je ne connais que range() pour faire une liste en ne stockant que la dernière valeur de celle-ci

Voici se qui se passe si je venais à supprimer le retour à la ligne de la ligne 3
(message du shell)

Traceback (most recent call last):
File "test.py", line 6, in <module>
if float(ligne) < 10.0:
ValueError: invalid literal for float(): 13.517.09.510.016.58.518.5

En vous remerciant
Messages postés
29649
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
20 septembre 2020
6 732
Tu pourrais initialiser la liste
lnotes = []

Remplacer l’écriture dans fichier2 par
lnotes.append(float(notes))

Puis au lieu d'une boucle sur fichier2, une boucle sur la liste
for x in range(len(lnotes)):

ou
for x in lnotes:
, faire un
print(x)
dans la boucle pour voir la différence
Messages postés
4
Date d'inscription
dimanche 17 mai 2020
Statut
Membre
Dernière intervention
17 mai 2020

la différence est simple:
1/ ça fonctionne
2/ c'est propre

le voici:

lnotes = []
with open("notes.txt", "r") as fichier1:
    for notes in fichier1:
        lnotes.append(float(notes))
with open("moyenne.txt", "w") as fichier2:
    for x in lnotes:
        if x < 10.0:
            print("{} {}".format(x, "recale"))            
        else:
            print("{} {}".format(x, "admis"))


La raison première de ma demande d'aide est que je ne comprenais pas mes erreurs.
Grâce à votre aide j'ai réussi l'exercice et mis le doigt sur plusieurs de mes erreurs:
1/ je complique trop mon script
2/ je n'utilise que les dernières leçons apprises (j'ai vue .append, 3 ou 4 chapitres avant)
3/j'aurais dû demander de l'aide un peut plus tôt (je bloque sur cet exercice depuis plus de 3 jours)

Avez vous remarqué autres choses à corriger et que je n'ai pas vue?
Merci pour vôtre aide ainsi que de m'avoir accorder un peut de votre temps.
Messages postés
29649
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
20 septembre 2020
6 732
Cela me semble bien.
Tu as raison, un programme est terminé quand on ne peut plus ... rien enlever ;-)

Une question : je ne fais pas réellement de python et pour tester des syntaxes n'ayant pas d'environnement, j'utilise le site online : https://www.jdoodle.com/python3-programming-online/ Sur ce site on ne peut pas utiliser des fichiers. Est-ce que le fait de faire
with open
et
print 
écrit dans le fichier, redirigeant la sortie standard (l'écran) ? Car dans ton programme original tu utilisais
write
. Dans ce cas print = write ? Si non, tu n'as pas vraiment testé l'anomalie qui t'a amenée à créer la question.
Messages postés
4
Date d'inscription
dimanche 17 mai 2020
Statut
Membre
Dernière intervention
17 mai 2020

Est-ce que le fait de faire
with open
et
print
écrit dans le fichier, redirigeant la sortie standard?
Oui (il me l'affiche directement dans le shell).

Dans ce cas
print
=
write
?
Non (print m'affiche le résultat du script dans le shell et write l'écris dans un script au format .txt ou autres au choix)

Si non, tu n'as pas vraiment testé l'anomalie qui t'a amenée à créer la question.
Si (à défaut de pouvoir les convertir en
float()
sans \n car python n'arrive pas à les lire dans cet ordre, ton idée de les convertir au moment de les ajouter un a un via
.append
a permis de les mettre en ligne déjà converti en
float()
puis un seul retour à la ligne via l'écriture formater).