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 :

Besoin d'aide pour la fonction glob et condition if chaîne de caractères sur plusieurs lignes


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 44
    Points : 30
    Points
    30
    Par défaut Besoin d'aide pour la fonction glob et condition if chaîne de caractères sur plusieurs lignes
    Bonsoir, j'ai à nouveau besoin mais c'est fois ci pour la fonction glob glob que je ne n'écrive pas du tout et aussi pour les condition if sur les chaîne de caractères sur plusieurs lignes et pour dire vrai la fonction glob glob j'ai tout compris je crois juste que l'on peut mettre des noms de fichiers avec caractères spéciaux. Exemple glob.glob('*t3.*') c'est pour tout les fichiers qui commence par n'importe et dans le nom fini par t3 et n'importe quel extentions c'est ça? Et pour la condition if avec chaîne caractères sur plusieurs lignes c'est avec des expressions régulières et \n pour les retours à la lignes. si dessous le code détailler
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    # -*- coding: cp1252 -*-
    import re
    import glob
    import os
    #Multiplieurs
    multiplieurCapacity = raw_input('entrée un nombre pour multiplier la Capacitée par ')
    multiplieurCapacityint = int(multiplieurCapacity)
    #fichier à traiter
    Dir = 'z:/source'
    while 1:
        if not os.path.isdir(Dir):
            print "That is not a valid folder name"
            Dir = raw_input("Enter your path to the parent directory: ")   
        else:
            for root, dirs, files in os.walk(Dir):
                for name in files:
                    filename = os.path.join(root, name)
                    dirname = os.path.dirname(filename)
                    dirname2 = 'z:/destination X' + multiplieurCapacity + '/' + dirname[10:]
                    basename = os.path.basename(filename)
                    split = os.path.split(filename)
                    splitdrive = os.path.splitdrive(filename)
                    splitext = os.path.splitext(filename)
                    fichierchemin = 'z:/destination X' + multiplieurCapacity + '/' + filename[10:]
                    print filename
                    print dirname
                    print basename
                    print split
                    print splitdrive
                    print splitext
                    t3 = glob.glob('*t3.*')
                    for filename in t3:
                        fichieropen = open(filename)
                        fichierread = fichieropen.read() #Lit tout le fichier d'un coup
                        if '\t*<Production.>\n\t*<ResourceName>ROFF_0</ResourceName>\n\t*<ResourceNumber>\d*</ResourceNumber>' in fichierread:
                            def Capacitymulti(Capacity):
                                return Capacity.group(1) + Capacity.group(2) + Capacity.group(3) + Capacity.group(4) + Capacity.group(5) + Capacity.group(6) + Capacity.group(7) + Capacity.group(8) + str(int(Capacity.group(9))  * multiplieurCapacityint) + Capacity.group(10)
                            Capacityregex='(\t*)(<Production.>)(\n)(\t*)(<ResourceName>ROFF_0</ResourceName>)(\n)(\t*)(<ResourceNumber>)(\d*)(</ResourceNumber>)'
                            Capacityreplace=re.sub(Capacityregex, Capacitymulti, fichierread)
                            print Capacityreplace
                            if os.path.exists(dirname2):
                                print 'exist déjà ' + dirname2
                            else:
                                os.makedirs(dirname2)
                            fichier2open=open(fichierchemin, "w")
                            fichier2write=fichier2open.write(Capacityreplace)
                        else:
                            fichieropen.close()
                            print 'Next'
            break
    raw_input('Appuie sur <Entrée> ...')
    ce que je veut faire c'est lire la quasi totaliter de z:/source (dossiers, sous dossiers de dossiers, sous dossiers de sous dossiers de dossiers etc avec fichiers) pour celà pas de problème pour l'instant le code que j'ai trouver sur internet marche, mais que quand il trouve un fichier avec ce nom '*t3.*' il le traite c'est à dire l'ouvre il vérifie si le fichier contient la chaîne de caractères sur plusieurs lignes suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '\t*<Production.>\n\t*<ResourceName>ROFF_0</ResourceName>\n\t*<ResourceNumber>\d*</ResourceNumber>'
    en expression régulière et \n pour retour à la ligne bien sur \t* nombre iconnu de tabution(s) et \d* nombre décimal entier si oui il effectue le traitement si non il ferme le fichier et fichier suivant et là je sais pas pourquoi non plus il ne marche pas, pourquoi à cause de l'expression régulère ??? \n ??? ??? \t* ??? ??? \d* ??? ou tout ça il y a t'il un moyen simple de contourner le problème de définir une fonction, et pour glob.glob ça marche comment?

    PS: ma version de python est la 2.7.2.

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 885
    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 : 3 885
    Points : 7 233
    Points
    7 233
    Par défaut
    Eh bien en fait tu imposes une méthode (les expressions régulières) que je n'aime pas, donc pas envie.

    Ensuite tu ne dis pas sous quelle forme sont les chaînes de caractères dans ton fichier et la forme recherchée.

    Puis, tu n'indiques pas d'exemples d'entrée sortie, qui rendrait tes explications lourdes, bien plus simple.

    Et enfin tu donnes tout le code, sans situer l'endroit te posant problème.

    Conclusion : Il est pas étonnant que tu n'es pas de réponse
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    En fait c'est un fichier *.class la forme à l'intérieur c'est du xml exemple pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    			<Production1>
    				<ResourceName>ROFF_0</ResourceName>
    				<ResourceNumber>240</ResourceNumber>
    ou 240 est un nombre décimal entier variable et 1 de Production1 et lui aussi, j'ai essayer l'expression régulière suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '\t*<Production.>\n\t*<ResourceName>ROFF_0</ResourceName>\n\t*<ResourceNumber>\d*</ResourceNumber>'
    mais sans résultat pour le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     t3 = glob.glob('*t3.*')
                    for filename in t3:
                        fichieropen = open(filename)
                        fichierread = fichieropen.read() #Lit tout le fichier d'un coup
                        if '\t*<Production.>\n\t*<ResourceName>ROFF_0</ResourceName>\n\t*<ResourceNumber>\d*</ResourceNumber>' in fichierread:
    glob.glob('*t3.*') ça ne marche j'ai pas du comprendre comment faire pour avoir que les fichiers avec ce type de nom, et pour le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if '\t*<Production.>\n\t*<ResourceName>ROFF_0</ResourceName>\n\t*<ResourceNumber>\d*</ResourceNumber>' in fichierread:
    c'est pour que si dans le fichier lu c'est à dire ouvert parce que nom de type *t3.*, si il y a ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    			<Production1>
    				<ResourceName>ROFF_0</ResourceName>
    				<ResourceNumber>240</ResourceNumber>
    traitement si non fichier suivant.

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 301
    Points : 6 781
    Points
    6 781
    Par défaut
    Salut,

    Si c'est de l'XML, il faut le lire comme un XML.

    Donc tu donnes un grand coup de gomme sur ton script et puis tu vas lire ceci:

    http://docs.python.org/library/xml.d...ml.dom.minidom

    C'est le plus facile pour commencer, et probablement suffisant pour ton usage.

    Il y a un exemple clair au paragraphe 19.7.2.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Si c'est de l'XML, il faut le lire comme un XML.

    Donc tu donnes un grand coup de gomme sur ton script et puis tu vas lire ceci:

    http://docs.python.org/library/xml.d...ml.dom.minidom

    C'est le plus facile pour commencer, et probablement suffisant pour ton usage.

    Il y a un exemple clair au paragraphe 19.7.2.
    Je pense pas que ce sois indispensable de le lire comme de l'XML juste trouver expression régulière qui dis ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    			<Production1>
    				<ResourceName>ROFF_0</ResourceName>
    				<ResourceNumber>240</ResourceNumber>
    mais en plus général pour les tabulations (variable), le 1 de Production1 qui peut varier et 240 lui aussi est variable toujours en entier décimal sans virgule. La condiction si ou if en anglais le code suivant ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if '\t*<Production.>\n\t*<ResourceName>ROFF_0</ResourceName>\n\t*<ResourceNumber>\d*</ResourceNumber>' in fichierread:
    alors que si je met quel chose de plus général comme ceci ROFF_0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ROFF_0 = """                     <Production1>
                                    <ResourceName>ROFF_0</ResourceName>
                                    <ResourceNumber>240</ResourceNumber>"""
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ROFF_0 in fichierread:
    ça passe mais le très gros problème c'est que c'est que comme ça que ça passe pas d'expression régulière possible comme ceci par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    \t*<Production.>
    \t*<ResourceName>ROFF_0</ResourceName>
    \t*<ResourceNumber>\d*</ResourceNumber>
    Alors si quelqu'un à une idée pour résoudre ça et aussi pour glob.glob ou quel chose d'équivalent je veut que si par exemple si un fichier qui commence par n'importe quoi dans son nom et fini par t3 et qui à n'inporte quel extention, c'est à dire de type *t3.* qui sois traiter c'est à dire lu qu'il vérifie si ROFF_0 in fichierread: si non fichier suivant.

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 301
    Points : 6 781
    Points
    6 781
    Par défaut
    Alors, pour glob, sous Linux je peux faire ceci:

    >>> import glob
    >>> glob.glob("*.txt")
    ['pysignal.txt', 'log.txt', 'gpg.txt', 'oqapy_desktop.txt']
    >>> glob.glob("*g.txt")
    ['log.txt', 'gpg.txt']
    >>> glob.glob("*g.*")
    ['log.txt', 'xorg.conf', 'readArg.py~', 'gpg.txt', 'readArg.py']
    >>>
    Sous windows, je ne sais pas si c'est pareil.

    Pour ton XML, vouloir le lire avec une regex est une réelle perte de temps.

    Tu as tout à gagner à apprendre à utiliser un parser XML, on finit toujours par se retrouver devant la question et puisque ton XML ne semble pas bien complexe tu as la chance d'aborder ça avec un cas simple.

    Je sais qu'en informatique on a un choix d'outils pour un même travail, mais les regex ne font pas partie des outils utilisables pour lire un XML.

    Hug !

  7. #7
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 301
    Points : 6 781
    Points
    6 781
    Par défaut
    Si tu pensais utiliser glob.glob() pour une recherche de fichier ponctuelle, ce n'est pas possible, glob.glob() retourne une liste.

    C'est ce que tu fais dans ton exemple de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
                    t3 = glob.glob('*t3.*')
                    for filename in t3:
                        fichieropen = open(filename)
    ...
    Qu'est-ce qui ne convient pas avec cette procédure ?

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Si tu pensais utiliser glob.glob() pour une recherche de fichier ponctuelle, ce n'est pas possible, glob.glob() retourne une liste.

    C'est ce que tu fais dans ton exemple de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
                    t3 = glob.glob('*t3.*')
                    for filename in t3:
                        fichieropen = open(filename)
    ...
    Qu'est-ce qui ne convient pas avec cette procédure ?
    Ce qui ne convient pas c'est que ça n'ouvre pas mon fichier le code suiavnt ne permet d'ouvrir tous les dossiers sur tous les niveaux
    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
    while 1:
        if not os.path.isdir(Dir):
            print "That is not a valid folder name"
            Dir = raw_input("Enter your path to the parent directory: ")   
        else:
            for root, dirs, files in os.walk(Dir):
                for name in files:
                    filename = os.path.join(root, name)
                    dirname = os.path.dirname(filename)
                    dirname2 = 'z:/destination X' + multiplieurCapacity + '/' + dirname[10:]
                    basename = os.path.basename(filename)
                    split = os.path.split(filename)
                    splitdrive = os.path.splitdrive(filename)
                    splitext = os.path.splitext(filename)
                    fichierchemin = 'z:/destination X' + multiplieurCapacity + '/' + filename[10:]
                    print filename
                    print dirname
                    print basename
                    print split
                    print splitdrive
                    print splitext
                    t3 = glob.glob('*t3.*')
                    for filename in t3:
    mais pas les fichiers avec un nom de type '*t3.*', le 1er code pour lire tous les sous dossiers d'un dossier sur tous les niveaux de ce dossier met pas avec glob mais walk, j'ai pas trouver d'équivalent pour ce que je veut faire en glob. Ce que je veut faire c'est très simple c'est parcourir un dossier ici z:/source (mais ça peut varier) et la quasi intégralité de tous ces sous dossier et fichier sur tous les niveaux possibles et existant sans ce soucier du nombre de niveaux existant et que pour les fichiers dont le nom sois du type '*t3.*' il ouvre le fichier et le traite puis quand il a fini avec lui le ferme et fichier suivant, mais pour ça il faudrais pouvoir que je puisse déjà faire la 1er chose à savoir parcourir la quasi totalité de z:/source tous niveaux confondu comme décrit plus haut et ensuite quand il trouve un fichier avec un nom de ce type il s'arrête de manière ponctuelle (c'est à dire temporairement) puis reprend quand traitement terminer. Une idée de comment faire ça?

    D'avance je vous remercie

    MediaVistaIntel

  9. #9
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Tu n’y arriveras pas avec glob, car les wildcards de celui-ci ne «*franchissent*» pas les répertoires (autrement dit, *t3.* ne sera recherché que dans le dossier courant, pas dans les sous-dossiers).

    Voici un petit générateur qui fait ça très bien, à base d’os.walk et fnmatch*:

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import fnmatch, os
     
    def irec_glob(pattern, root="/"):
        for path, dummy, files in os.walk(root):
            for fn in fnmatch.filter(files, pattern):
                yield os.path.join(path, fn)
     
    for fn in irec_glob("*oiio*", "/home/i7deb64"): print(fn)

    Me donne, sur mon dossier perso*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /home/i7deb64/blender-2.5-svn/OpenImageIO-oiio-Release-0.10.4-0-gad1950d.tar.gz
    /home/i7deb64/blender-2.5-svn/OpenImageIO-oiio-Release-0.9.2-4-gcdd62f7.tar.gz
    /home/i7deb64/blender-2.5-svn/OpenImageIO-oiio-cdd62f7/build/linux64/python/CMakeFiles/PyOpenImageIO.dir/py_oiio.cpp.o
    /home/i7deb64/blender-2.5-svn/OpenImageIO-oiio-cdd62f7/src/cmake/oiio_macros.cmake
    /home/i7deb64/blender-2.5-svn/OpenImageIO-oiio-cdd62f7/src/python/py_oiio.h
    /home/i7deb64/blender-2.5-svn/OpenImageIO-oiio-cdd62f7/src/python/py_oiio.cpp
    /home/i7deb64/blender-2.5-svn/OpenImageIO-oiio-cdd62f7/src/doc/oiiointro.tex
    /home/i7deb64/blender-2.5-svn/OpenImageIO-oiio-ad1950d/build/linux64/python/CMakeFiles/PyOpenImageIO.dir/py_oiio.cpp.o
    /home/i7deb64/blender-2.5-svn/OpenImageIO-oiio-ad1950d/src/cmake/oiio_macros.cmake
    /home/i7deb64/blender-2.5-svn/OpenImageIO-oiio-ad1950d/src/python/py_oiio.h
    /home/i7deb64/blender-2.5-svn/OpenImageIO-oiio-ad1950d/src/python/py_oiio.cpp
    /home/i7deb64/blender-2.5-svn/OpenImageIO-oiio-ad1950d/src/doc/oiiointro.tex
    Note que seuls les fichiers sont matchés (et retournés), pas les dossiers…

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Merci à toi Mont29 pour ton message et ton code exceptionnel mon problème est résolu voici le code fini
    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
    43
    44
    45
    46
    47
    # -*- coding: cp1252 -*-
    import fnmatch, os, re
    #Multiplieurs
    multiplieurCapacity = raw_input('entrée un nombre pour multiplier la Capacitée par ')
    multiplieurCapacityint = int(multiplieurCapacity)
    #fichier à traiter
    def irec_glob(pattern, root="/"):
        for path, dummy, files in os.walk(root):
            for fn in fnmatch.filter(files, pattern):
                yield os.path.join(path, fn)
    Dir = raw_input("Enter your path to the parent directory: ")
    longueur_Dir = len(Dir)
    print longueur_Dir
    while 1:
        if not os.path.isdir(Dir):
            print "That is not a valid folder name"
            Dir = raw_input("Enter your path to the parent directory: ")
            longueur_Dir = len(Dir)
            print longueur_Dir
        else:
            for root, dirs, files in os.walk(Dir):
                for fn in irec_glob("*t3.*", Dir):
                    dirname = os.path.dirname(fn)
                    dirnametemp = 'z:/temp/destination X' + multiplieurCapacity + '/' + dirname[longueur_Dir:]
                    dirname2 = 'z:/destination X' + multiplieurCapacity + '/' + dirname[longueur_Dir:]
                    basename = os.path.basename(fn)
                    split = os.path.split(fn)
                    splitdrive = os.path.splitdrive(fn)
                    splitext = os.path.splitext(fn)
                    fichierchemintemp = 'z:/temp/destination X' + multiplieurCapacity + '/' + fn[longueur_Dir:]
                    fichierchemin = 'z:/destination X' + multiplieurCapacity + '/' + fn[longueur_Dir:]
                    print fn
                    print dirname
                    print dirnametemp
                    print dirname2
                    print basename
                    print split
                    print splitdrive
                    print splitext
                    print fichierchemintemp
                    print fichierchemin
                    fichieropen = open(fn, "r")
                    fichierread = fichieropen.read() #Lit tout le fichier d'un coup
                    execfile('Z:/Cities XL Sous programme python/Sous programme python ROFF_0.py')
                break
            break
    raw_input('Appuie sur <Entrée> ...')
    je marque donc résolu pour ce topic, et oui je programme pour rechercher et remplacer des fichiers d'un jeux et faire ainsi des plugins.

  11. #11
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Eeeek*! Beaucoup de «*bruit*» dans ce code… En voivi une version quelque peu nettoyée et simplifiée*:

    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
    # -*- coding: cp1252 -*-
    import fnmatch, os, re
     
    #Multiplieurs
    # Be careful here, user might enter a non-numeric string… 
    multiplieurCapacity = raw_input('Entrer un nombre par lequel multiplier la Capacitée : ')
    multiplieurCapacityint = int(multiplieurCapacity)
     
    def irec_glob(pattern, root="/"):
        for path, dummy, files in os.walk(root):
            for fn in fnmatch.filter(files, pattern):
                # Returning a tuple (dir, file) seems more useful for your code...
                yield (path, fn)
     
    #fichier à traiter
    Dir = raw_input("Enter your path to the parent directory: ")
    # No need for Dir length, and looping while Dir is not valid is enough!
    while not os.path.isdir(Dir):
        print "That is not a valid folder name"
        Dir = raw_input("Enter your path to the parent directory: ")
     
    for dirname, fn in irec_glob("*t3.*", Dir):
        # Get dirname relative to Dir.
        dirname = os.path.relpath(dirname, Dir)
        # Use rather os.path.join...
        dirname_temp = os.path.join("z:", "temp", "destination X" + multiplieurCapacity, dirname)
        dirname_final = os.path.join("z:", "destination X" + multiplieurCapacity, dirname)
        # fn is already a base name (i.e. file name, without "dir" path).
        fichierchemin_temp = os.path.join(dirname_temp, fn)
        fichierchemin_final = os.path.join(dirname_final, fn)
        print fn
        print dirname
        print dirname_temp
        print dirname_final
        print fichierchemin_temp
        print fichierchemin_final
        # Use with statement as often as you can, it avoids forgetting to close a file, e.g...
        with open(os.path.join(Dir, dirname, fn), "r") as fichieropen:
            fichierread = fichieropen.read() #Lit tout le fichier d'un coup
        execfile('Z:/Cities XL Sous programme python/Sous programme python ROFF_0.py')
     
    raw_input('Appuie sur <Entrée> ...')
    Note complémentaires*:
    * Je n’ai évidemment pas pu tester ce code, donc il est livré tel quel, j’ai pu y faire quelques coquilles…
    * Évite de mélanger français et anglais dans ton code (et si possible, n’utilise que l’anglais, comme ça tout programmeur normalement constitué aura des chances de pouvoir suivre ton code)
    * Essaye aussi d’avoir des noms de variables cohérents et informatifs (“dirname2” est… troublant )
    * J’ai supprimé certaines variables de chemin apparemment inutilisées, à toi de les recréer si tu en as vraiment besoin.
    * Lire un fichier pour n’en rien faire est étrange, mais j’imagine que ton code est toujours en développement…

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par mont29 Voir le message
    * Lire un fichier pour n’en rien faire est étrange, mais j’imagine que ton code est toujours en développement…
    Ce mais pas pour en faire rien c'est pour remplacer certains type de valeurs dans certaines type de balise dans les fichiers bien sur si pas remplacer puisque non trouver, le fichier et fermer et fichier suivant, le code du 1er sous programme "Z:\Cities XL Sous programme python\Sous programme python ROFF_0.py"
    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: cp1252 -*-
    def Capacitymulti(Capacity):
        return Capacity.group(1) + Capacity.group(2) + Capacity.group(3) + Capacity.group(4) + Capacity.group(5) + Capacity.group(6) + Capacity.group(7) + Capacity.group(8) + str(int(Capacity.group(9))  * multiplieurCapacityint) + Capacity.group(10)
    Capacity_ROFF_0_regex='(\t*)(<Production.>)(\n)(\t*)(<ResourceName>ROFF_0</ResourceName>)(\n)(\t*)(<ResourceNumber>)(\d*)(</ResourceNumber>)'
    Capacity_ROFF_0_replace=re.sub(Capacity_ROFF_0_regex, Capacitymulti, fichierread)
    print Capacity_ROFF_0_replace
    if Capacity_ROFF_0_replace != fichierread:
        Capacity_RHOT_0_regex='(\t*)(<Requirement.>)(\n)(\t*)(<ResourceName>RHOT_0</ResourceName>)(\n)(\t*)(<ResourceNumber>)(\d*)(</ResourceNumber>)'
        Capacity_RHOT_0_replace=re.sub(Capacity_RHOT_0_regex, Capacitymulti, Capacity_ROFF_0_replace)
        print Capacity_RHOT_0_replace
        Capacity_RIN3_0_regex='(\t*)(<Requirement.>)(\n)(\t*)(<ResourceName>RIN3_0</ResourceName>)(\n)(\t*)(<ResourceNumber>)(\d*)(</ResourceNumber>)'
        Capacity_RIN3_0_replace=re.sub(Capacity_RIN3_0_regex, Capacitymulti, Capacity_RHOT_0_replace)
        print Capacity_RIN3_0_replace
        if os.path.exists(dirnametemp):
            print 'exist déjà ' + dirnametemp
        else:
            os.makedirs(dirnametemp)
        if os.path.exists(dirname2):
            print 'exist déjà ' + dirname2
        else:
            os.makedirs(dirname2)
        fichierchemintempopen=open(fichierchemintemp, "w")
        fichierchemintempopen.write(Capacity_RIN3_0_replace)
        fichierchemintempopen.close()
        fichiercheminopen=open(fichierchemin, "w")
        execfile('Z:/Cities XL Sous programme python/Cities XL MaxJobPerCulture/Cities XL MaxJobPerCulture RIN3_0.py')
        fichieropen.close()
        fichierchemintempopen.close()
        fichiercheminopen.close()
    else:
        fichieropen.close()
        print 'None'
    puis celui de "Z:/Cities XL Sous programme python/Cities XL MaxJobPerCulture/Cities XL MaxJobPerCulture RIN3_0.py"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    re_tag=re.compile(r'[<>]')
    we_are_in_the_MaxJobPerCulture_area = False
    for l in open(fichierchemintemp):
        if "</MaxJobPerCulture>" in l:
            we_are_in_the_MaxJobPerCulture_area = False
        if we_are_in_the_MaxJobPerCulture_area:
            splitted_line = re_tag.split(l)
            new_val = int(splitted_line[2]) * multiplieurCapacityint * 2
            new_line = "%s<%s>%.i<%s>\n" % (splitted_line[0], splitted_line[1], new_val, splitted_line[3])
            fichiercheminopen.write(new_line)
        else:
            fichiercheminopen.write(l)
        if "<MaxJobPerCulture>" in l:
            we_are_in_the_MaxJobPerCulture_area = True
    Voilà avec mon code final à moi .

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

Discussions similaires

  1. Besoin d'aide pour la fonction"SI"
    Par chouchou_82 dans le forum Excel
    Réponses: 2
    Dernier message: 12/01/2009, 08h17
  2. besoin d aide pour les fonction en postgresql
    Par dannw dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 11/07/2007, 21h20
  3. Besoin d'aide pour la fonction execute immediate
    Par kevin8100 dans le forum Oracle
    Réponses: 13
    Dernier message: 25/06/2007, 15h00
  4. [FPDF] Besoin d'aide pour une fonction publipostage..;
    Par dark$hadow dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 10/02/2007, 15h39
  5. [Mail] besoin d'aide pour la fonction mail
    Par laymounos dans le forum Langage
    Réponses: 5
    Dernier message: 07/06/2006, 21h16

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