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 :

modification de txt


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Décembre 2019
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement de composants

    Informations forums :
    Inscription : Décembre 2019
    Messages : 113
    Par défaut modification de txt
    Bonjour,
    j'essai de modifier un txt en fonction de son contenu.

    le txt peut être vide ou non...
    si il est vide l'ajout d'une ligne doit pouvoir se faire.
    si il est déjà rempli, je dois pouvoir vérifier le contenu, éventuellement modifier l'état d'une ligne et si toutes les lignes sont ok, éventuellement en ajouter une autre.

    d'habitude j'ai pas de souci pour créer un txt et écrire dedans... mais les possibilités d'écriture/ajout/lecture ne me paraissent pas si compatibles que ça!
    pour accéder au contenu d'un fichier les 3 lignes ci dessous marchent bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                fichier_suivi_dt = open(r"chemin" + os.sep + str(dt_modifiee) + os.sep + "Suivi.txt", "r")
                self.liste_suivi_dt = fichier_suivi_dt.readlines()
                fichier_suivi_dt.close()
    par contre pour la modifier au besoin... il faut que je passe en mode open "w" ou "a+"
    le code ci dessous me semble prometteur dans le sens ou deux open sont imbriqués (l'un en mode write et l'autre en mode lecture/ajout).
    mais j'ai beau tourner les possibilités dans tous les sens... j'ai toujours une possibilité qui ne passe pas (soit je ne peux pas ajouter une ligne, soit je ne peux pas lire ou contrôler le contenu d'un fichier....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        def update(self, file_path, old, new):
            fh, abs_path = mkstemp()
            with open(fh,'w') as new_file:
                with open(file_path, "a+") as old_file:
                    if any(new[1:10] in s for s in self.liste_suivi_dt): #self.liste_suivi_dt contient la liste du contenu de mon fichier old
                        for line in old_file:
                            new_file.write(line.replace(old, new))
                        copymode(file_path, abs_path)
                        remove(file_path)
                        move(abs_path, file_path)
                    else:
                        new_file.write(new)
                        copymode(file_path, abs_path)
                        remove(abs_path)
                        move(abs_path, file_path)
    le code ci dessus est une bonne piste?
    merci!

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 728
    Par défaut
    Salut,

    Un fichier texte est constitué de lignes de longueur arbitraire. Pour le modifier, le plus simple est de le lire ligne par ligne et d'écrire (ligne par ligne) une nouvelle version (avec le nouveau contenu) avec ou sans changements.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Décembre 2019
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement de composants

    Informations forums :
    Inscription : Décembre 2019
    Messages : 113
    Par défaut
    ok, merci!
    donc en gros, c'est pas la peine de chercher à mettre à jour/modifier un txt.
    Et finalement, un code comme ci-dessous est n'est finalement pas trop moche?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    fichier = open(r"C:\Users\clement\Desktop\test_csv\data_test.txt", "w")
    fichier.write("ligne1\n")
    fichier.write("ligne2\n")
    fichier.write("ligne3\n")
    fichier.close()
     
    fichier = open(r"C:\Users\clement\Desktop\test_csv\data_test.txt", "r")
    liste_lignes = fichier.readlines()
    fichier.close()
     
    liste_lignes[1]="newline2\n"
     
    fichier = open(r"C:\Users\clement\Desktop\test_csv\data_test.txt", "w")
    for i in range(0, len(liste_lignes), 1):
        fichier.write(liste_lignes[i])
    fichier.close()
    A la base je voulais éviter d'ouvrir plusieurs fois successivement le fichier que je souhaitais traiter.
    Si je comprend bien, les lignes ci dessus correspondent à:
    lignes 1-5 => creation du fichier (si il n'existe pas) et remplissage ligne par ligne puis fermeture du fichier
    lignes 7-9 => ouverture du fichier en mode lecture et enregistrement du contenu dans une liste puis fermeture du fichier
    ligne 11 => mise à jour de la liste
    lignes 13-16 => réouverture du fichier en mode écriture (il existe déjà donc ça le réinitialise en effaçant le contenu tout seul) puis écriture ligne par ligne en fonction du contenu de la liste et enfin, fermeture

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 728
    Par défaut
    Salut,

    Citation Envoyé par clement_74 Voir le message
    Et finalement, un code comme ci-dessous est n'est finalement pas trop moche?
    Vous pourriez améliorer le côté Python en utilisant la construction with open(...) as f (un context manager).
    Après côté algorithme, lire tout le fichier, modifier quelques lignes et écrire le tout va bien pour de petits fichiers.
    Lorsqu'ils sont plus gros, on a peut être intérêt à traiter par paquets de lignes (voir le paramètre de .readlines).
    Côté écriture fabriquer un tampon en mémoire et l'écrire d'un seul coup pourra être plus efficace (fichier.write(''.join(liste_lignes)).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Décembre 2019
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement de composants

    Informations forums :
    Inscription : Décembre 2019
    Messages : 113
    Par défaut
    ok, merci
    j'ai donc tout rebasculé avec des with open,
    je vais regarder de plus près les paramètres du readlines au cas ou un jour ce type de manip s'applique sur de gros fichiers (là ce n'était pas le cas (10 lignes max)).

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    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 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par clement_74 Voir le message
    mais les possibilités d'écriture/ajout/lecture ne me paraissent pas si compatibles que ça!
    Sisi, ça fonctionne très bien pour peu qu'on sache comment ça se passe.
    Le mode "r" permet de lire, le mode "r+" permet de lire et aussi d'écrire
    Le mode "w" permet d'écrire (si le fichier existe déjà il est alors vidé au préalable), le mode "w+" fait comme "w" tout en offrant aussi la possibilité de lire ce qui a été écrit
    Le mode "a" permet d'écrire à la fin. Toute écriture se fera toujours à la fin (même si le pointeur n'est pas à la fin, au moment d'écrire il se place d'abord à la fin). Le mode "a+" fait comme "a" tout en offrant aussi la possibilité de lire
    Ensuite la seconde chose qu'il faut comprendre, c'est que même si on peut lire et écrire, il n'y a qu'un seul pointeur. Donc si on lit un truc et qu'on veut le remplacer, il faut alors revenir en arrière (file.seek) pour pouvoir écrire par dessus.
    La 3° chose c'est que justement quand on écrit, on ne fait que remplacer ce qui existe, il n'y a pas d'insertion. Si par exemple un fichier contient deux lignes "toto" et "tutu" (donc en réalité "toto\ntutu\n"), si tu reviens au début et que tu écris "abc" ça donnera alors "abco\ntutu\n", et si tu écris "abcde" ça donnera alors "abcdetutu\n" et tu n'as alors plus qu'une seule ligne.

    Citation Envoyé par clement_74 Voir le message
    donc en gros, c'est pas la peine de chercher à mettre à jour/modifier un txt.
    Ben tout dépend de ce qu'on veut faire. Remplacer un "a" par un "x" (ou tous les "a" par des "x") ça va, remplacer "hello" par "Salut la Terre ici Mars" ça ira moins bien...

    Citation Envoyé par clement_74 Voir le message
    mais j'ai beau tourner les possibilités dans tous les sens...
    Oui ben déjà faire du remove sur un fichier ouvert...
    Et (accessoirement), quand tu écris...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if truc:
    	actionA
    	copymode(file_path, abs_path)
    	remove(file_path)
    	move(abs_path, file_path)
    else:
    	actionB
    	copymode(file_path, abs_path)
    	remove(file_path)
    	move(abs_path, file_path)
    ...tu ne sens pas confusément que ça pourrait s'écrire...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if truc:
    	actionA
    else:
    	actionB
    copymode(file_path, abs_path)
    remove(file_path)
    move(abs_path, file_path)
    ???

    Citation Envoyé par clement_74 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fichier = open(r"C:\Users\clement\Desktop\test_csv\data_test.txt", "w")
    for i in range(0, len(liste_lignes), 1):
        fichier.write(liste_lignes[i])
    fichier.close()
    Dommage que readlines ne t'ai pas fait penser à writelines...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fichier = open(r"C:\Users\clement\Desktop\test_csv\data_test.txt", "w")
    fichier.writelines(liste_lignes)
    fichier.close()
    Citation Envoyé par clement_74 Voir le message
    je vais regarder de plus près les paramètres du readlines au cas ou un jour ce type de manip s'applique sur de gros fichiers (là ce n'était pas le cas (10 lignes max)).
    Le problème ne vient pas du fichier petit ou gros (je viens de faire un test sur 15 millions de lignes et readlines a tout ingurgité) mais du traitement que tu fais ensuite. Parce que travailler sur 15 millions de lignes ça prendra 1 million de fois plus de temps que travailler sur 15 lignes.
    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]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Détection fermeture et modif fichier *.txt
    Par toutounesan dans le forum VB.NET
    Réponses: 1
    Dernier message: 10/10/2011, 13h52
  2. Modif. Format de champ.txt avec une requête
    Par Gias Service dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 04/07/2006, 18h10
  3. Ouverture et modification d'un fichier .txt
    Par Marty McFly dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 22/05/2006, 09h57
  4. [Javascript] UPLOAD FICHIER(avc code de modif du txt dun iput type file)
    Par genjikun dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 01/02/2006, 16h05
  5. Affichage de fichier.txt et modification des couleurs
    Par Furius dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 04/12/2005, 17h33

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