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 :

Copier / Coller d'un fichier txt


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 129
    Par défaut Copier / Coller d'un fichier txt
    Bonjour,

    Le but de ce petit script est de mettre à jour des fichiers de configuration utilisé par une application.
    J'ai donc un dossier qui contient mes fichiers de configuration : C\MonAppli\cfg qui contient cfgserver.txt, cfgoracle.txt, cfgappli.txt...
    Et un dossier qui contient une ou plusieurs lignes à rajouter sur un ou plusieurs fichiers de configuration : C:\MAJ\cfgserver.txt, cfgappli.txt.
    Dans cet exemple je dois récupérer le contenu de cfgserver.txt et le mettre à la fin du fichier C:\MonAppli\cfg\cfgserver.txt idem avec cfgappli.txt.
    Ce n'est pas tout le temps les mêmes fichiers à mettre a jour. Parfois j'en ai qu'un.

    Passons à la structure des fichiers :
    Dans C:\MonAppli\cfg\ les fichiers sont structurés ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    {
    {Le contenu du fichiers}
    {encore un}
    }
    Le fichier commence par un { et fini par } il faut donc insérer le texte avant ce caractère; A noter que ce caractère est utilisé plusierus fois dans le fichier.

    Dans le dossier C:\MAJ
    Les fichiers ne sont pas strucuré. Il faut donc récupérer le contenu tel quel et le coller avant la fin du } de l'autre fichiers

    J'espère avoir été clair.

    D'avance merci pour vos réponses.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Ce que j'ai compris, c'est qu'il faut ajouter un insert JUSTE AVANT la DERNIÉRE parenthèse '}'.
    La fonction rfind() va nous servir à trouver la position de cette dernière parenthèse dans la succession de caractères qu'est le fichier.

    Il faut insérer du texte avant cette dernière parenthèse. Ça c'est la représentation intellectuelle de ce qu'on veut faire.

    En pratique, on ne peut pas écarter des octets sur un disque dur pour mettre des octets supplémentaires entre eux dans un fichier.

    On peut seulement, en mode 'r+' :
    - positionner le pointeur du fichier à la position p à partir de laquelle on veut ajouter l'insert dans le fichier
    - enregistrer tous les caractères qui suivent cette position, jusqu'à la fin du fichier = chaine postp
    - ramener le pointeur à la position p, car le fait de lire l'a emmené à la fin du fichier
    - écrire l'insert dans le fichier à partir de la position p, c'est à dire que les caractères préexistant situés après p sont ÉCRASÉS (c'est le mode 'r+')
    - une fois finie cette écriture-écrasement, le pointeur peut être en plein milieu des caractères qui constituaient la fin du fichier après p (chaine postp), ou en zone vierge après ces caractères (qui ont été écrasés) après débordement de la fin du fichier. Je le dis pour que ce soit bien clair, mais ça n'a aucune importance pratique
    - le pointeur étant à la fin de l'insert, il suffit alors de poursuivre l'écriture en réécrivant la chaine postp qui se retrouve ainsi in fine déplacée sur le disque dur

    Voilà comment je comprends les choses, merci de me dire si je me trompe sur un point ou un autre.



    Dans le cas que tu nous soumets, brandtance, '{' est le seul caractère qu'il faut réécrire après l'insert. On ne va donc pas faire son enregistrement préalable dans postp, on sait que c'est lui qui est à ajouter comme chaine postp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    fi = open('C:\MAJ\cfgserver.txt')
    insert = fi.read()
    fi.close()
     
    g = open('C:\MonAppli\cfg\cfgserver.txt','r+')
    ch = g.read()
    p = ch.rfind('{')
    g.seek(p)
    g.write(insert + '{')
    g.close()

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 129
    Par défaut
    Salut et merci pour cette belle réponse.

    Citation Envoyé par eyquem Voir le message
    Ce que j'ai compris, c'est qu'il faut ajouter un insert JUSTE AVANT la DERNIÉRE parenthèse '}'.
    Oui c'est ça
    La fonction rfind() va nous servir à trouver la position de cette dernière parenthèse dans la succession de caractères qu'est le fichier.
    Jusque là je suis ;-)
    Il faut insérer du texte avant cette dernière parenthèse. Ça c'est la représentation intellectuelle de ce qu'on veut faire.
    Ok, c'est exact.
    On peut seulement, en mode 'r+' :
    - enregistrer tous les caractères qui suivent cette position, jusqu'à la fin du fichier = chaine postp
    J'avoue que la je suis un peu perdu : car si tu cherches '}' c'est la fin du fichier, donc tu n'a plus besoin d'enregistrer les caractères suivant...
    - ramener le pointeur à la position p, car le fait de lire l'a emmené à la fin du fichier
    - écrire l'insert dans le fichier à partir de la position p, c'est à dire que les caractères préexistant situés après p sont ÉCRASÉS (c'est le mode 'r+')
    - une fois finie cette écriture-écrasement, le pointeur peut être en plein milieu des caractères qui constituaient la fin du fichier après p (chaine postp), ou en zone vierge après ces caractères (qui ont été écrasés) après débordement de la fin du fichier. Je le dis pour que ce soit bien clair, mais ça n'a aucune importance pratique
    - le pointeur étant à la fin de l'insert, il suffit alors de poursuivre l'écriture en réécrivant la chaine postp qui se retrouve ainsi in fine déplacée sur le disque dur
    Je suis pas sûr d'avoir compris (désolé je suis en mode boulet) : en fait tu mets en buffer le contenu du fichier puis tu effaces le contenu ensuite tu colles le nouveau contenu du fichier qui est accompagné du nouveau fichier c'est ça ?

    Voilà comment je comprends les choses, merci de me dire si je me trompe sur un point ou un autre.


    Dans le cas que tu nous soumets, brandtance, '{' est le seul caractère qu'il faut réécrire après l'insert.
    Euh, non, j'ai dis ça moi ? lol

    En tout cas merci pour tout! Je vais tester ton code!!!

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 129
    Par défaut
    Arf, le code ne marche pas tout a fait comme je voudrais :
    Voici mon fichier qui se trouve dans le dossier MAJ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ici je mets le contenu de mon fichier ligne 1
    ici je mets le contenu de mon fichier ligne 2
    ici je mets le contenu de mon fichier ligne 3
    ici je mets le contenu de mon fichier ligne 4
    Voici le contenu du fichier à mettre à jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    {
    Ligne 1 de mon fichier de configuration
    Ligne 2 de mon fichier de configuration {Ici je test les caracteres}
    Ligne 3 de mon fichier de configuration
    }
    Il faudrait donc insérer le texte avant le dernier '}'

    Mais voici le résultat lorsque j'execute ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    {
    Ligne 1 de mon fichier de configuration
    Ligne 2 de mon fichier de configuratioici je mets le contenu de mon fichier ligne 1
    ici je mets le contenu de mon fichier ligne 2
    ici je mets le contenu de mon fichier ligne 3
    ici je mets le contenu de mon fichier ligne 4
    {
    Voici mes remarques :
    - Il faudrait que la première ligne inserer soit sur une nouvelle ligne, et non en continu (Ligne 2 de mon fichier de configuratioici je mets le contenu de mon fichier ligne 1)
    - Si il y a d'autres caractères {} ils sont supprimés
    - Le dernier caractère du fichier doit être un } et non un {


    J'essaie de modifier le code mais je galère
    En tout cas merci.

  5. #5
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Si ce fichier de configuration ne doit être lu que par des scripts python, ce serait certainement plus simple de sérialiser ces données avec pickle ou shelve.

    Ces deux modules te permettent de stocker telles qu'elles des structure de données python, sans t'ennuyer avec tout ce bazar qu'est la gestion d'un fichier texte et la création d'une structure flexible.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 129
    Par défaut
    Malheureusement ta solution n'est pas possible. Je t'explique c'est pour la mise à jour d'une application et ces fichiers sont parfois modifié à la main (via un éditeur de texte).
    J'ai besoin d'un script pour 'industrialisé' la mise à jour de l'application qui est utilisé dans plusieurs établissements. En gros pour mettre à jour mon application je voudrais juste lancer ce script au lieu d'éditer x fichiers sur y établissements. Cependant, comme dit plus haut, la modification se fait parfois à la mano pour changer des options.

    Merci,

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

Discussions similaires

  1. Copier coller d'un fichier vers un autre
    Par loloz27 dans le forum Excel
    Réponses: 2
    Dernier message: 02/02/2009, 17h40
  2. Réponses: 1
    Dernier message: 09/12/2008, 12h23
  3. boucle avec copier coller dans un fichier excel
    Par Chalu_C_Momo dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 20/11/2008, 16h45
  4. copier-coller d'un fichier
    Par laurentdepibrac dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/07/2007, 16h41

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