Forum Programmation.python modification de fichier

Posté par  .
Étiquettes : aucune
0
7
sept.
2006
Bonjour,
je cherche à remplacer un mot dans un fichier texte.
J'arrive à le faire en créant un nouveau fichier, puis en remplaçant l'ancien fichier par le nouveau.
Je me demandais s'il était possible de faire la modification directement sur le fichier d'origine, sans passer par un fichier intermédiaire (à la façon sed -i).
Je suppose qu'il faut ouvrir le fichier en rw, mais je ne sais pas comment écrire dans le fichier à l'endroit qui va bien.
Il y a peut être une astuce qui m'échappe.
Merci
  • # sed : remplacement d'une chaîne

    Posté par  . Évalué à 1.

    Bonjour,

    Il y a un précédent article sur le sujet.
    Il est peut être ancien, mais toujours d'actualité ;)
    http://linuxfr.org/tips/27.html
  • # Seek/tell, mais pas forcément intéressant

    Posté par  . Évalué à 2.

    Un truc comme ca doit fonctionner:
    def main():
        f = file("myfile", "r+b", 0)
        i = f.readline()
        while i:
            c = i.find("bar")
            if c != -1:
                a = f.tell()
                f.seek(-len(i) + c, 1)
                f.write("foo")
                f.seek(a)
            i = f.readline()
        f.close()
    
    En gros tu te balades dans ton fichiers, quand tu trouves ton texte ("bar") tu te replace à la bonne position et tu écris ton nouveau texte ("foo"). Le problème avec la gestion des fichiers (enfin de ce que je sais sous Linux), c'est que tu ne peux pas insérer de données. Tu peux remplacer 3 caractères par 3 caractères, mais tu ne peux pas déplacer toutes les données du fichier pour mettre plus de données (insérer une ligne par example).
  • # seek() / tell()

    Posté par  (site web personnel) . Évalué à 3.

    Avec ces deux fonctions tu peux savoir où tu en es dans ton fichier, et te déplacer directement à un endroit.

    Après, si la chaine de remplacement est plus grande, il faut commencer par agrandir le fichier et recopier tout ce qui est derrière afin de faire de la place - puis ensuite seulement remplacer ce que tu veux.

    Et si la chaine de remplacement est plus petite, il faut écraser le morceau de l'ancienne chaine qui dépasse en recopiant tout ce qui est derrière, puis tronquer le fichier.

    Si tu peux utiliser les fichiers mappés, ça sera peut-être un peu plus naturel - voir quand même côté modification de la taille d'un fichier mappé.

    PS. Pour raccourcir un fichier, cf chsize()

    Zieute Google:
    man seek
    man tell
    man chsize

    Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.