IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Ecrire à un certain endroit d'un fichier avec python


Sujet :

Python

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2019
    Messages : 12
    Par défaut Ecrire à un certain endroit d'un fichier avec python
    Bonjour,

    J'ai encore une fois un soucis avec on projet scolaire (BAC), c'est pourquoi je reviens ici pour obtenir de l'aide.

    Je souhaiterai écrire dans un fichier, à un certains endroit dans celui-ci.

    Voici un bout de code que je vais commenter pour vous aider à comprendre ce que je veux obtenir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        with open('resultats.txt','r', encoding='utf-8') as donnees:
            for donn in donnees:
                don = donn.split('_')
                if don[0] == nm:
                    ecrireresult = open('resultats.txt','a', encoding='utf-8')
                    ecrireresult.write('_'+score)
    Ici, j'ouvre mon fichier 'resultats.txt', ensuite je le lis ligne par ligne et je découpe chaque ligne pour n'avoir à tester que le premier élément.
    si ce premier élément répond à la condition, je veux ajouter un score à la suite de ma ligne dans mon fichier.. or ici le score est ajouté à la dernière ligne du fichier Comment puis=je l'ajouter à la suite?

    Merci d'avance pour votre temps

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Hélas cela ne peut pas fonctionner ainsi, tu dois lire l'entièreté du fichier, le fermer, modifier le texte que tu as lu et réouvrir le fichier en écriture pour y écrire le texte modifié.

    Peu importe le nombre de lignes que comporte ton texte, avec Python cette opération aura l'air "instantanée".

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Sporax Voir le message
    or ici le score est ajouté à la dernière ligne du fichier
    Normal. Le mode "a" (append) fait que toute écriture se fait toujours à la fin du fichier.

    Citation Envoyé par Sporax Voir le message
    Comment puis=je l'ajouter à la suite?
    Déjà ouvrir le fichier en "r" puis le réouvrir en "a" est absurde. Tu l'aurais ouvert en "a+" ça te donnait le "a" avec le "r" en plus.
    Donc en appliquant le même raisonnement (cumuler la lecture et l'écriture) on trouve assez rapidement le mode d'ouveture adéquat "r+" ("r" plus "w")

    Ensuite, en calculant adroitement la position où écrire et en utilisant ensuite seek() pour te placer à l'endroit de ton choix du fichier, tu peux écrire à cet endroit.

    Le souci toutefois, c'est que le fichier n'a pas de notion de "ligne". Ce que toi tu vois comme (par exemple)...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Les sanglots longs
    Des violons
    De l automne
    ...est en réalité stocké de la façon suivante: Les sanglots longs\nDes violons\nDe l automne. Et donc si tu te places à la fin de la première phrase "sanglots longs" et que tu écris "hello world", le fichier deviendra alors Les sanglots longshello worlds\nDe l automne (remplacement et non insertion).

    Donc soit tu codes une fonction d'insertion de texte, fonction qui se charge d'écrire le texte au bon endroit du fichier et de réécrire aussi tout ce qui se trouvait après jusqu'à la fin ; soit tu stockes tout le fichier en mémoire (readlines() qui stocke tout dans un tableau de lignes), ensuite tu modifies les lignes de ton choix ; et enfin tu réécris toutes les lignes dans le fichier (writelines()).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2019
    Messages : 12
    Par défaut
    Salut,

    Merci pour vos conseils, j'ai essayé de les appliquer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        with open('resultats.txt','r+', encoding='utf-8') as donnees:
            fichier=donnees.readlines()
            for donn in fichier:
                if donn.startswith(nm): #ce chemin la n'est pas reconnu
                    donn += donn+'_'+score
                    fichier.append(donn)
                    break;
                else:
                    fichier.append(nm+"_"+score) #ce chemin = n'efface pas l'ancien contenu
                    break;
            print(fichier)
            donnees.writelines("%s" % l for l in fichier)
    cependant il demeure quelques problèmes, pourquoi mon premier chemin n'est pas reconnu? et comment effacer le contenu du fichier pour réécrire (suis-je obliger de passer par cela?)

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Sporax Voir le message
    pourquoi mon premier chemin n'est pas reconnu?
    Ah ben ça il te faudra trouver seul. Déjà je dirais "parce que le texte situé dans donn ne commence pas par celui situé dans nm".
    Donc à partir de ce constat, à toi de chercher. Et pour ça peut-être qu'afficher les variables "donn" et "nm" t'y aideront.

    Citation Envoyé par Sporax Voir le message
    et comment effacer le contenu du fichier pour réécrire
    Tu as mélangé tous nos conseils en une seule pate assez indigeste. Si tu veux lire un fichier et pouvoir aussi y réécrire, tu l'ouvres en "r+" (en te souvenant que tout ce que tu y écris écrase ce qui se trouve à cet endroit). Si tu veux lire tout le fichier pour le traiter en mémoire et ensuite pour le réécrire totalement, alors tu l'ouvres en "r", tu le lis, tu le fermes, puis tu le ré-ouvres en "w" et tu le réécris entièrement et tu le fermes.

    Citation Envoyé par Sporax Voir le message
    (suis-je obliger de passer par cela?)
    Pas forcément. Dans ma première option, je t'indiquais qu'en créant une fonction destinée à insérer du caractère dans un fichier, tu pourrais alors ensuite l'utiliser pour insérer ce que tu veux entre les lignes "l" et "l+1". Mais comme toute écriture écrase ce qui s'y trouve (l'insertion n'est pas par défaut), la fonction en question devait alors s'occuper de réécrire tout ce qui se trouve perdu dans l'écrasement. Et comme cette réécriture écrase là encore ce qui se trouve après, la fonction devait alors, à partir de l'endroit d'insertion, réécrire tout jusqu'à la fin.
    C'est faisable bien entendu mais ce n'est peut-être pas le traitement le plus optimisé (ça dépend surtout du nombre d'insertions et de la taille du fichier quoi).

    Accessoirement, la variable "fichier" est un tableau contenant toutes les lignes du fichier. Si tu écris ensuite fichier.append(truc), tu n'écris pas "truc" dans la ligne "x" mais tu rajoutes une nouvelle ligne "truc". Or il m'avait semblé, d'après ton premier post, que tu voulais rajouter des trucs dans les lignes et non pas rajouter de nouvelles lignes (sinon l'ouverture "a" aurait suffit).
    Donc la ligne en cours de traitement c'est "donn", ensuite "donn" est complétée mais pour que "donn" soit replacé dans la ligne "x" du fichier il faut que tu écrives quelque chose comme fichier[x]=donn (et si tu avais donné des noms de variables plus en adéquation avec la nature de leur contenu tu t'en sortirais mieux parce que nommer "donnees" pour un fichier, "fichier" pour son contenu qui sont des lignes et "donn" pour une ligne c'est pas des plus malins, ni le break inéluctable à la première itération de ta boucle ).

    Et ensuite, la liste en intension ("%s" % l for l in fichier) est strictement équivalente à la liste "fichier" donc tu peux remplacer donnees.writelines("%s" % l for l in fichier) par plus simplement donnees.writelines(fichier) (punaise ces noms à la con...).

    Donc ton code devrait ressembler à un truc comme ça...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    with open('resultats.txt', 'r', encoding='utf-8') as fp: tabLignes=fp.readlines()
     
    for (i, lig) in enumerate(tabLignes):
    	lig=lig.replace("\n", "")
    	if lig.startswith(nm):
    		tabLignes[i]="%s_%s\n" % (lig, score)
    	else:
    		tabLignes[i]="%s_%s\n" % (nm, score)
    	# if
    	# Ou bien tabLignes[i]=%s_%s\n" % (lig if lig.startswith(nm) else nm, score)
    # for
     
    with open('resultats.txt', 'w', encoding='utf-8') as fp: fp.writeliines(tabLignes)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2019
    Messages : 12
    Par défaut
    Merci beaucoup pour tes indications, explications et conseils.

    j'ai juste du mal à comprendre cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (i, lig) in enumerate(tabLignes):
    c'est une double lecture?

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Sporax Voir le message
    j'ai juste du mal à comprendre cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (i, lig) in enumerate(tabLignes):
    c'est une double lecture?
    Non mais faudrait quand-même voir à acquérir les bases quoi. Comment veux-tu courir si tu ne sais pas marcher ? Un forum ça aide oui mais ça ne remplace pas un tutoriel !!!

    enumerate(tab, start=0) va te retourner une suite d'items (x, y) avec "y" énumérant chaque élément de "tab" et "x" représentant le rang dudit élément dans le tableau, rang commençant à "start".

    for (i, x) in enumerate(tab): print(i, x) équivaut à for i in range(len(tab)): print(i, tab[i])...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Remplacer certaines virgules dans un fichier (avec sed ?)
    Par Christophe P. dans le forum Shell et commandes GNU
    Réponses: 10
    Dernier message: 26/01/2018, 11h26
  2. lire/ecrire plusieurs graphes dans un seul fichier avec Networkx
    Par mohsenuss91 dans le forum Général Python
    Réponses: 3
    Dernier message: 15/02/2015, 18h02
  3. Réponses: 3
    Dernier message: 13/08/2013, 08h38
  4. Réponses: 2
    Dernier message: 06/09/2009, 22h41
  5. copier fichier avec python
    Par fboss dans le forum Général Python
    Réponses: 2
    Dernier message: 19/05/2009, 14h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo