Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ecrire dans fichier texte

Sujet résolu
23 novembre 2015 à 16:45:11

Salut ! Nous avons fait un TP qui consiste à écrire un texte et l'enregistrer sous forme de fichier .txt sur Python.

Nous devons ici calculer les moyennes de trois élèves.

Voici mon code:

def moyenne_eleve(M):
    M=M.split()
    somme=0
    for i in range(1,len(M)):
        somme+=float(M[i])
    moyenne=somme/(len(M)-1)
    return moyenne
        
def ecrire(entree,sortie):
    fich=open(entree,"r")
    ligne=fich.readline()
    while ligne:
        fichier = open(sortie, "a")
        fichier.close()
        fichier = open(sortie, "a")
        fichier.write(" : ".join([ligne.split()[0],str(moyenne_eleve(ligne)),"\n"]))
        ligne=fich.readline()
    return ligne

print ecrire("notes.txt","resultats.txt")

Voici le fichier notes.txt de départ:

Dupont 12 5.5 17.5 16
Durand 3 2.5 0 4
Duval 14 6 10 10

Voici ce que je dois obtenir dans le fichier resultats.txt:

Dupont : 12.75
Durand : 2.375
Duval : 10.0

Et voici ce que j'obtiens dans le fichier resultats.txt:

Dupont : 12.75 : 
Durand : 2.375 : 
Duval : 10.0 : 


Que dois-je faire pour obtenir ce que je veux?

Merci d'avance !

PS: Ne changez pas la fonction moyenne_eleve(M), elle fonctionne !



-
Edité par poncinloic 23 novembre 2015 à 16:49:22

  • Partager sur Facebook
  • Partager sur Twitter
23 novembre 2015 à 17:15:03

Essaie ça:

fichier.write(" : ".join([ligne.split()[0],"{}\n".format(moyenne_eleve(ligne))]))
  • Partager sur Facebook
  • Partager sur Twitter
Précepte: Le mieux est l'ennemi du bien
23 novembre 2015 à 18:07:35

Salut,

Je propose ça (je t'ai désobéi, j'ai changé moyenne_eleve)

def moyenne_eleve(M):
    # On coupe le tout proprement
    M = M.split()
    # On récupère nom et liste de notes séparément
    nom, M = M[0], M[1:]
    # Retourne le tuple nom, moyenne, de façon à avoir toutes les infos
    # sans avoir besoin de retoucher la liste.
    return (
        nom,
        sum([
            float(note)
            for note in M
        ])/len(M),
    )
         
def ecrire(entree, sortie):
    # On récupère toutes les lignes d'un coup.
    lignes = open(entree, 'r').readlines()
    # On vire les \r et \n qui sont conservés par readlines
    lignes = [ligne.strip('\r\n') for ligne in lignes]
    # On ouvre une seule fois le fichier à modifier
    with open(sortie, 'a') as fichier:
        for ligne in lignes:
            # moyenne_eleve contient un tuple, on peut le passer tel quel
            fichier.write("%s : %s\n" % moyenne_eleve(ligne))
    return open(sortie, 'r').read()
 
print ecrire("notes.txt", "resultats.txt")


J'ai un peu nettoyé ton code, fais attention aux règles d'élégance quand tu programmes. Petite remarque, en l'état, si tu exécutes ce code successivement plusieurs fois, ton fichier ne sera pas nettoyé et donc tu accumuleras des lignes. Si tu veux qu'il soit nettoyé au lancement du script, change le 'a' du open par un 'w'.

C'est encore nettoyable, mais l'idée était surtout que ça soit clair pour toi.

Gare aux lignes trop longues et donc illisibles. :)

-
Edité par Neoterranos 23 novembre 2015 à 18:09:37

  • Partager sur Facebook
  • Partager sur Twitter
23 novembre 2015 à 18:36:00

Merci pour vos réponses !

Olygrim, que signifie stp:

"{}\n".format(moyenne_eleve(ligne))

et Neoterranos ce n'est pas grave pour la moyenne ;) mais c'est juste que j'ai du mal à voir un programme comme tu l'écris pour le moment, surement à cause du manque d'habitude !

-
Edité par poncinloic 23 novembre 2015 à 18:36:52

  • Partager sur Facebook
  • Partager sur Twitter
23 novembre 2015 à 18:59:07

La méthode format permet de placer dans les {} le contenu de ses arguments. Tapes ça dans ta console et regardes ce que ça affiche:

nom = "Skywalker"
fils = "Luke"
fille = "Leia"
mechant = "Dark Vador"

msg = "{} et {} {} sont les enfants de {}".format(fille, fils, nom, mechant)
print(msg)


Et les possibilités sont plus grande car tu peux même améliorer l'affichage:

valeur = 3.333333333333

msg = "{:.2f} à 10-2 près".format(valeur)
print(msg)


Je te laisse le lien vers la page officielle si tu veux approfondir cette méthode ^^

-
Edité par Olygrim 23 novembre 2015 à 19:00:03

  • Partager sur Facebook
  • Partager sur Twitter
Précepte: Le mieux est l'ennemi du bien
28 novembre 2015 à 23:52:54

poncinloic a écrit:

Merci pour vos réponses !

Olygrim, que signifie stp:

"{}\n".format(moyenne_eleve(ligne))

et Neoterranos ce n'est pas grave pour la moyenne ;) mais c'est juste que j'ai du mal à voir un programme comme tu l'écris pour le moment, surement à cause du manque d'habitude !

-
Edité par poncinloic le 23 novembre 2015 à 18:36:52


Ce que j'ai écrit est là à titre d'exemple, tu es libre de ne pas t'en servir. :)
  • Partager sur Facebook
  • Partager sur Twitter
29 novembre 2015 à 8:15:38

Oui bien sûr mais c'est toujours intéressant d'apprendre de nouvelle chose :)
  • Partager sur Facebook
  • Partager sur Twitter