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

Réseau/Web Python Discussion :

Remplacer du texte via python


Sujet :

Réseau/Web Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 79
    Points : 43
    Points
    43
    Par défaut Remplacer du texte via python
    Coucou,

    Soit un fichier téléchargé, renommé et chmodé via ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import urllib,os
    the_location="/home/toto/xmlfiles/"
     
    urllib.urlcleanup()
    url="http://www.toto.fr/fichier.xml"
    dest=the_location + "toto.xml"
    monurl = urllib.urlretrieve(url,dest)
    os.chmod(dest,0777)
    Dans ce fichier xml, j'aimerais remplacer les caractères "&" par "&"

    j'ai donc essayé:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import urllib,os
    import replace
    the_location="/home/toto/xmlfiles/"
     
    urllib.urlcleanup()
    url="http://www.toto.fr/fichier.xml"
    dest=the_location + "toto.xml"
    monurl = urllib.urlretrieve(url,dest)
    os.chmod(dest,0777)
    >>>'&'.replace('c','amp;',2)
    '&'
    mais j'ai une erreur de syntaxe. qu'es-ce que j'ai râté?

    ++

  2. #2
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    ????


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ch = 'la banquise &fout& le camp'
    ch = ch.replace('&','amp;',2)
    print ch
    résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    la banquise amp;foutamp; le camp
    Mais ce ne serait pas plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ch = ch.replace('&','&',2)     ?????
    PS : donne le message d'erreur. Ça aide

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 79
    Points : 43
    Points
    43
    Par défaut
    ça fonctionne mieux en effet :p

    cela dit le print l'affiche dans le terminal, mais dans le fichier ça ne change rien :/

    comment faire le changement à l'intérieur du fichier?

    ++

  4. #4
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    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
    f = open('fifi','r')
    # fifi est le nom du fichier à modifier
    g = open('nouveau_fichier','w')
    while 1:
        rd = f.readline()
        if rd.count('&')==2:
            g.write(rd.replace('&','&',2))
        else:
            g.write(rd)
        if rd=='':
            break
    f.close()
    g.close()
    remove('fifi')
    rename('nouveau_fichier','fifi')

    Le 1 dans while 1 est considéré comme True par Python.
    En Python, tout ce qui n'est rien (0,[], dictionnaire vide,chaine égale à '',etc) est équivalent à False et tout ce qui n'est pas rien est équivalent à True. C'est trés pratique: Python, c'est quand même quelque chose !
    Ceci étant, perso je préfère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    rd = 'go'
    while rd:
        rd = f.readline()
        if rd.count('&')==2:
            g.write(rd.replace('&','&',2))
        else:
            g.write(rd)

    Comme tu n'as pas répondu à la question, le code ci dessus remplace '&' par '&' et non par 'amp;'.


    Il y a un autre moyen de faire sans avoir à créer un fichier nouveau temporaire et le renommer après avoir effacé l'ancien: avec le mode 'r+' qui est un mode de correction dans lequel on écrase des caractères au sein d'un fichier en écrivant des nouveaux caractères par dessus.
    Ce n'est possible que dans le seul cas où on parvient à faire des corrections qui ne vont pas entrainer une modification de la taille totale du fichier: s'il fait 3678567 octets avant, il doit en faire pile la même chose après.
    Ça nécessite de controler très précisément et rigoureusement les positions où l'on écrit en écrasant dans le fichier.
    Dans ton cas , ce n'est à priori pas envisageable puisque tu remplaces des sous-chaines de longueur 1 par des sous-chaines de longueur 5.
    Sauf si dans toutes les lignes où il y aurait à faire deux remplacements, il y a 8 caractères blancs en fin de chacune de ces lignes , ce qui permet d'envisager de décaler toute les fins de ces lignes vers leurs extrémités qui ,dans le fichier , ne sont rien d'autres que les caractères '\n'.
    On peut aussi envisager décaler les fins de ligne '\n' si la ligne suigvante a suffisamment de blancs au début pour le permettre, mais là ça devient Monte Carlo Circus.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 79
    Points : 43
    Points
    43
    Par défaut
    Re
    Oui c'était bien & par & , jme suis emmêlé les pinceaux

    J'ai testé ta première solution et ça fonctionne bien.

    Ceci dit il y a une erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NameError: name 'remove' is not defined
    le deuxième fichier est bien crée, mais apparemment il a du mal à supprimer l'original, puis renommer?

    Et enfin, je n'ai pas trouvé la bonne syntaxe pour insérer "the_location" dans ta solution, pour l'instant j'ai comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f = open('/home/toto/xmlfiles/toto.xml','r')
    ++ et merci beaucoup

  6. #6
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    NameError: name 'remove' is not defined
    Dans un tel cas, c'est simple:
    http://www.python.org/doc/2.5/lib/genindex.html
    A la lettre r: remove() (in module os)
    Ah ! remove() est dans un module !
    Il faut donc l'importer. De même pour rename. C'est un oubli de ma part:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from os import remove,rename


    the_location="/home/toto/xmlfiles/"
    dest=the_location + "toto.xml"
    alors dest est ="/home/toto/xmlfiles/toto.xml" et c'est ce qui doit remplacer 'fifi' dans mon code

    Mais ça veut dire quoi
    j'ai comme f = open('/home/toto/xmlfiles/toto.xml','r') ???
    Ça veut dire que ça marche ou que ça ne marche pas ?

    Si tu veux dire que cette écriture marche et que tu veux mettre la variable dans l'expression open(), rien de plus simple, il suffit d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f = open(the_location + 'toto.xml','r')

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

Discussions similaires

  1. Programme de remplacement de texte dans des fichiers
    Par Invité4 dans le forum Linux
    Réponses: 13
    Dernier message: 12/11/2006, 16h06
  2. Comment remplacer un texte ?
    Par EssaiEncore dans le forum Langage
    Réponses: 8
    Dernier message: 09/12/2005, 11h42
  3. Remplacer un texte par un autre
    Par Guillaume602 dans le forum C++
    Réponses: 3
    Dernier message: 24/11/2005, 00h40
  4. [langage] Remplacer du texte dans un fichier
    Par Michaël dans le forum Langage
    Réponses: 9
    Dernier message: 11/03/2005, 15h19
  5. [Débutant] Initialiser zone de texte via un tableau
    Par Theseus dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 27/01/2005, 10h19

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