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 :

Python 2.7 - Chercher caractère dans un fichier


Sujet :

Python

  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 Python 2.7 - Chercher caractère dans un fichier
    Bonjour,

    En Python 2.7, je dois chercher le caractère '}' et juste avant insérer un string.

    Actuellement, je parcours le fichier ligne par ligne et en suite caractère par caractère... Mais je trouve ça un peu trop bourrin. Quelle est la meilleure des solutions ?
    Je reste bloqué car il ne voit pas forcément le caractère '}' à cause des caractères de retour à ligne, des tabulations, etc...

    D'avance merci,

  2. #2
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Bonjour, la meilleur solution est d'utiliser le module re, avec une REGEX.

    Que dois tu faire une fois le caractère trouvé? Il y a peut etre une methode pour string ou un autre module encore mieux adapté fonction de tes besoins précis. Détaille nous un peu plus ce que tu désire faire.

  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
    Tout d'abord merci pour ta réponse.

    En gros, nous avons des fichiers de configuration (qui sont tout pourris ) )
    Le fichier commence par un { et termine par un }. Bon ça c'est en théorie car vu que tout le monde modifie les fichiers il y a parfois des sauts de ligne en plus à la fin.

    Le but est d'insérer du texte juste avant le '}' et de sauter une ligne. Exemple :
    // Avant la modification :
    //MonExempleDeFichier
    {
    maconf = coucou
    }

    -------
    // Après la modification :
    //MonExempleDeFichier
    {
    maconf = coucou
    serveur = MonAdresse
    }

  4. #4
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    D'accord, je comprend mieux.

    Si tu regarde ici: http://docs.python.org/2/library/std...string-methods, la méthode find devrait te plaire.

    Tu lui passes trois paramètres: le premier est la chaine que tu cherches (dans ton cas "}" si j'ai bien compris), le second est l'index du caractère de départ, le troisième l'index de fin de recherche. la méthode find va alors te renvoyer l'index le plus faible s'il trouve quelque chose, sinon il renverra -1.

    Utilise du coup la méthode readline:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    f = open('file','r')
    f_tmp = open('file_tmp', 'w')
    f_line = f.readline()
    while f_line <> "":
        rtr = f_line.find("}\n") #je cherche, sous linux, le caractère }, sur la ligne entière
        if rtr <> -1:
            f_tmp.write("texte en sus")
        f_tmp.write(f_line)
        f_line = f.readline
    #puis reecriture de f_tmp dans f
    C'est bien sur juste un code exemple pour illustrer. Là tu lit le fichier ligne à ligne (ce qui est mieux, surtout si tes fichiers sont très gros), puis dans chaque ligne, tu cherche ton caractère. Si tu le détectes, tu peut alors faire un insert.

    Cela te convient il?

    NB: la méthode replace peut aussi t'interesser, selon ton besoin precis

  5. #5
    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
    Waouh! Ca c'est de la réponse!
    J'étudie tout ça, je test et je reviens vers toi

    Merci beaucoup

  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
    Ben ça n'a pas l'air de fonctionner :

    rtr = f_line.find("}\n")
    AttributeError: 'builtin_function_or_method' object has no attribute 'find'

    EDIT : Il manquait le () à la fin de readline... Je continue à tester ton code

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    C'est encore trop vague comme description de problème.

    Il faut être plus précis quand à la mise en forme de ton fichier.

    Sont tous-t-ils identiques, même nombre de paramètres, etc... ?

    @deussys

    Il y a bien longtemps que l'opérateur "différent" est modifié de <> à !=

  8. #8
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Comme je l'ai précisé, c'était juste un exemple, et de fait non testé. l'erreur est Humaine. Désolé pour ce petit contre temps

    EDIT: concernant le <>, je le sait bien. C'est un reste de nombreux autres langages. Il est vrai que je n'y pense pas tant que le compilateur ne m'indique pas d'erreur

  9. #9
    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
    Je vais essayer de donner plus d'informations.
    Nous avons plusieurs fichiers de configurations, qui sont tous différents! Certains contiennent 3 paramètres, d'autres 50! Les règles de syntaxe sont les suivantes :
    • Commencer par un {
    • Terminer par un }
    • Les paramètres sont sous la forme suivante : maVariable = "maValeur"


    Le soucis c'est que les fichiers sont modifiés par plusieurs personnes...Et ça devient n'importe quoi! En gros avant ou après un { ou } nous pouvons avoir des saut de lignes, des tabulations, des espaces...

    Le but du petit bout de code, c'est de récupérer l'index du caractère '}' pour pouvoir rajouter des paramètres avant.

  10. #10
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    As tu résussit ce que tu voulais faire brandtance?

  11. #11
    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
    Bonjour,

    Non pas encore...
    En fait la j'arrive juste à trouver le caractère '}' en utilisant les Regex.
    J'aimerai bien trouvé son emplacement pour pouvoir insérer mon texte...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    import re
     
    test = open('C:\test.cfg','r')
    dataConf = test.read()
     
    myRegex = re.compile(r'{')
    # strings = re.findall(r'^{',dataConf,re.M)
    strings = myRegex.findall(dataConf)
     
    test.close()

  12. #12
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Quelque chose comme ça te convient?

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #!/usr/bin/env python
    #-*- coding:utf-8 -*
     
    import re
     
    def add_param(file_src, file_dst, param, value):
    	f = open(file_src,'r')
    	f_tmp = open(file_dst, 'w')
     
    	myRegex = re.compile(r'{')
     
    	f_line = f.readline()
     
    	while f_line <> "":
    		f_tmp.write(f_line)
    		reg_obj = myRegex.search(f_line)
    		if reg_obj != None:
    			if reg_obj.pos == 0:
    				f_tmp.write(param + "=" + "\"" + value +"\"" + "\n")
    		f_line = f.readline()
     
    	f.close()
    	f_tmp.close()
     
     
    def overwrite_config_file(file_src, file_dst):
    	f = open(file_src,'w')
    	f_tmp = open(file_dst, 'r')
     
    	f_complet = f_tmp.read()
    	f.write(f_complet)
     
    	f.close()
    	f_tmp.close()
     
     
    if __name__ == "__main__":
    	file_src = "./test.cfg"
    	file_dst = "./file_tmp.txt"
     
    	add_param(file_src, file_dst, "ParametreSus", "Valeur")
    	overwrite_config_file(file_src, file_dst)

  13. #13
    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,

    Si tu séparais les blocs compris entre '{' et '}' ce ne serait pas plus facile ?

    Avec en plus la possibilité de nettoyer le fichier.

    Exemple:

    lefichier.conf (salopé par tes collègues)
    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
     
    {
    maconf = coucou
    serveur = MonAdresse
    }
    {
    saconf = hello
    serveur = SonAdresse
     
    }
     
    {
    taconf = bonjour
     
    serveur = TonAdresse
    }
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    # -*- coding: utf-8 -*-
     
    import re
     
    FIND_RE = re.compile('(?<={)(.*?)(?=})', re.DOTALL)
     
    def parse_config():
        with open('/home/vincent/Bureau/conf.cfg', 'r') as inf:
            txt = inf.read()
            # On sépare les blocs {...}
            confs = FIND_RE.findall(txt)
            out = []
            if confs:
                for conf in confs:
                    # On divise en lignes
                    lines = conf.split('\n')
                    # On nettoye les lignes vides
                    lines = [l.strip() for l in lines if l.strip()]
                    # On reconstitue
                    out.append('{\n' + '\n'.join(lines) + '\n}\n')
     
            # On ajoute un élément par exemple à `hello`
            for idx, item in enumerate(out):
                if 'hello' in item:
                    out[idx] = item[:-2] + 'pswd = sdfghjkl54351fogiyfj\n}\n'
     
            # Contrôle
            for o in out:
                print o
     
    parse_config()
    Le résultat
    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
    17
     
    vincent@tiemoko:~/Bureau$ python reader.py 
    {
    maconf = coucou
    serveur = MonAdresse
    }
     
    {
    saconf = hello
    serveur = SonAdresse
    pswd = sdfghjkl54351fogiyfj
    }
     
    {
    taconf = bonjour
    serveur = TonAdresse
    }

  14. #14
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Petite proposition:

    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
    17
    18
    19
    20
    21
    22
    23
    import re
     
    def sub(g):
        # la fin de ligne peut être ajustée en fonction de l'OS
        return '\n' + 'maVariable = "maValeur"' + '\n}'
     
    ch = '''xxxx
    {
    y = "toto"
    }
    xxxx
    {
     
     
    }
    xxxx
    {
    t = "tata"}
    xxxx'''
     
    motif = r'([^\"{]*})'
    ch2 = re.sub(motif, sub, ch)
    print ch2
    Ce qui donne:

    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
    xxxx
    {
    y = "toto"
    maVariable = "maValeur"
    }
    xxxx
    {
    maVariable = "maValeur"
    }
    xxxx
    {
    t = "tata"
    maVariable = "maValeur"
    }
    xxxx
    Pour le motif, pour neutraliser les éventuels fin de ligne avant le '}' trouvé, j'ai dit que avant le '}', il fallait neutraliser tous les caractères jusqu'au '"' ou '{' précédent. A voir si ça convient. Il faudrait modifier si certains paramètres ne se terminaient pas par '"': par exemple x=123.

    Au cas où il faudrait paramétrer le remplacement en fonction d'autre choses, le préciser: en plaçant la fonction 'sub' comme méthode d'une classe, on peut faire pas mal de choses plus complexes.

  15. #15
    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
    Merci à tous, je devrai trouver mon bonheur...
    Mais étant débutant il va me falloir du temps.

    Encore merci,

Discussions similaires

  1. Réponses: 9
    Dernier message: 19/03/2013, 15h58
  2. Chercher un caractère dans un fichier
    Par achrafkaran dans le forum Tcl/Tk
    Réponses: 5
    Dernier message: 20/10/2011, 19h05
  3. [Batch] Chercher chaines de caractères dans plusieurs fichiers
    Par stefanelle dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 28/01/2011, 11h21
  4. Réponses: 6
    Dernier message: 19/02/2010, 13h17
  5. chercher un caractère dans un fichier text
    Par stelaazurra dans le forum Windows Forms
    Réponses: 7
    Dernier message: 22/04/2009, 19h21

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