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 :

optimisation de code


Sujet :

Python

  1. #1
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 944
    Points
    1 944
    Par défaut optimisation de code
    salut
    a mon travail, mon superieur avait besoin d'un script ou programme a faire rapidement dans l'heure. je me suis proposer (C) il m'a dit que ca serait trop long alors j'ai tente python. ca marche comme je veux mais je me dit que ca doit etre tres sale comme code donc je vous le montre et demande de si c'est optimisable ou tout simplement nettoyable.
    le but:
    lire un fichier texte de la forme
    c:\dir\dir\dir\fichier.jpg
    ligne a metre dans un fichier
    celle ci aussi
    c:\dir\dir\dir\fichier2.JPG
    ligne a mettre dans un fchier
    donc je recupere le nom du fichier.jpg et je fais un fichier.txt contenant les lignes suivante jusqu'au prochain chemin.
    j'avais du mal a extraire le nom en fin de path donc j'ai magouille avec les methodes que j'ai trouver parci par la sur le net.
    bon voici le code et merci de me dire si c'est vraiment horrible et comment le simplifier. je rappelle qui fonctionne comme je veux (peut etre par hazar).
    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
    fin=open('rien.txt','r')
    lines = fin.readlines()
    for i in range(len(lines)):
    	cut = lines[i]
    	if "JPG" in cut or "jpg" in cut:
    		name = cut[::-1]
    		pos  =  name.find('\\')
    		name = name[0:pos:1]
    		tmp = name.split('.')
    		name = tmp[1]
    		filename = name[::-1]+".txt"
    		print "writing file : "+filename
     
    		fout = open(filename,'w')
    		i=i+1
    		while i<len(lines):
    			cut = lines[i]
    			if "JPG" in cut or "jpg" in cut:
    				i=i-1
    				break;
    			fout.write(cut)
    			i = i+1
                   fout.close()
    fin.close()
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

  2. #2
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 327
    Points : 257
    Points
    257
    Par défaut
    Bonjour,

    Etant donné que vous avez besoin d'une réponse rapide, voila un code rapide qui devrait convenir :

    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
    fin=open('rien.txt','r')
    lines = fin.read().split("\n") # decoupe par ligne
    for i in lines:
        fichier = i.split("\\")[-1]
        if fichier.split(".")[-1] == "jpg" or fichier.split(".")[-1] == "JPG":
             # Image
             try: fichier.close()
             except: pass
             nom_fichier = fichier.split(".")[0]
             fichier=open(nom_fichier ,'w')
        else:
             # Lignes en dessous du fichier image
             fichier.write(str(i))
    fichier.close()
    fin.close()
    Utilisez absolument le split qui permet de découper une chaine et place le résultat dans une liste (tableau si vous connaissez le C). Le caractère dans le split découpe cette chaine avec ce caractère et sert de séparateur dans la liste.

    Bon courage...

    Mickael

  3. #3
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Bonjour,

    vous pouvez aussi utiliser le module os, cf la FAQ.
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  4. #4
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    Un rien plus concis :

    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/env python
    # -*- coding: utf-8 -*-
     
    import os
     
    with open("infile.txt", "r") as inf:
        for line in inf.readlines():
            l = line[:-1]
            if l[-4:] in [".jpg", ".JPG"]:
                f = ".".join([l[:-4], "txt"])
            else:
                with open(f, "a") as outf:
                    outf.write(line)

  5. #5
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 944
    Points
    1 944
    Par défaut
    @Apocalypses
    merci pour la reponse c'est ce que je cherche en plus claire que ce que j'ai fais cependant c'est apeine plus court que le mien bien que plus lisible.

    @VinsS
    effectivment tres concis donc pile poil le style que je cherche. juste un question, debutant en python ne serait-il pas raisonnable de me concentrer sur le code d'apocalypses pour mieux comprendre le language plutot que utiliser des pacquets tous prets? (sinon au boulot en effet question productivite c'est justement ce que je dois faire. mais ma question c'est point de vu pedagogique)
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

  6. #6
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Si par pédagogique on comprend 'bonnes pratiques' je penche poue le code de VinsS. Il n'est pas si difficile a comprendre en fait.
    Bien qu'au niveau des noms de fichier de sortie cela ne fonctionne pas pour moi.
    Voici ce qui fonctionne pour moi
    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/env python
    # -*- coding: utf-8 -*-
    #
    #
    with open("rien.txt", "r") as inf: # with ferme automatiquement le fichier.
        for line in inf.readlines(): # Lecture ligne par ligne
            l = line[:-1] # Suppression du carractères de fin.
            if l[-4:].lower() == ".jpg": # Une alternative à la liste de VinsS. L'idée de la liste (que je préfère) est bonne aussi.
                chm = l[:-4].split("\\") # Décortique le chemin
                longchm = len(chm) - 1 # On prend le nombre d'éléments pour
                f = chm[longchm] + ".txt" # finalement ne garder que le dernier et lui rajouter .txt
            else:
                with open(f, "a") as outf: # Même principe with ferme automatiquement le fichier.
                    outf.write(line)
    Bonne découverte
    Merci d'utiliser le forum pour les questions techniques.

  7. #7
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Petite explication puisque j'ai deux minutes
    J'ai rajouter des print pour voir comment cela se passe
    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #
    #
    with open("rien.txt", "r") as inf:
        for line in inf.readlines():
            l = line[:-1]
            print l
            if l[-4:].lower() == ".jpg":
                print l[-4:].lower()
                chm = l[:-4].split("\\")
                print chm
                longchm = len(chm) - 1
                print longchm
                f = chm[longchm] + ".txt"
                print chm[longchm] + ".txt"
            else:
                with open(f, "a") as outf:
                    outf.write(line)
    En voici la sortie
    c:\dir\dir\dir\fichier.jpg C'est le print l. Sans le caractère de fin donc
    .jpg lower() mets en minuscule
    ['c:', 'dir', 'dir', 'dir', 'fichier'] Décomposition de la ligne. Comme \ et un caractère d'échappement on en mets deux "\\"
    4 C'est bien 5 éléments mais l'index commence à zéro.
    fichier.txt Le dernier élément (index 4 ici) + .txt
    ligne a metre dans un fichier Ecriture des lignes
    celle ci aussi
    c:\dir\dir\dir\fichier2.JPG On retrouve .jpg
    .jpg etc...
    ['c:', 'dir', 'dir', 'dir', 'fichier2']
    4
    fichier2.txt
    ligne a mettre dans un fchier

    J'espère que c'est plus parlant.

    Bon code
    Merci d'utiliser le forum pour les questions techniques.

  8. #8
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 944
    Points
    1 944
    Par défaut
    hmmmm, j'ai envi de vous embrasser tous domage que vos nom soit consonnance masculine.
    merci on ne peut etre plus claire.
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

  9. #9
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Juste un dernier détail

    Dans le cadre de fichiers de types multiples:
    if l[-4:].lower() in [".jpg", ".bmp", ".cif"]:

    Citation Envoyé par pacificator Voir le message
    vous pouvez aussi utiliser le module os, cf la FAQ.
    Bonjour pacificator,

    Vu le contenu du fichier rien.txt je pense que pour la portabilité il est préférable de l'attaquer en mode texte.
    Je suis sur que le module os de mon pingouin n'apprécie pas les chemins de type c:\dir\dir\dir\fichier.jpg

    Bon code
    Merci d'utiliser le forum pour les questions techniques.

  10. #10
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 944
    Points
    1 944
    Par défaut
    c'est drole mais je code sous fedora14. j'ai windows installe en dualboot mais j'y vais une fois par mois juste pour compiler la version windows (officielle) que la boite demande mais je travail sous linux en attendant que les binaires linux interresse ma boite.
    bref j'ai la chance d'avoir un bosse qui me laisse choisir mon environement pour faire du C ca a d'ailleur l'avantage de m'obliger a etre portable donc oui en effet le mode texte.
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

  11. #11
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    Là, c'est moi qui pose une question.

    Je n'ai jamais utilisé python avec Windows et je soupçonne que ceci explique cela.

    C'est quoi ça :

    merci

  12. #12
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 944
    Points
    1 944
    Par défaut
    moi non plus j'ai jamais fait mais voila

    sous linux tu as /home/machin/chouette
    donc quand tu tapepas de problemes c'est COOL.
    mais sous windows c'est c:\machin\chouette
    donc tu as si tu regardes bien il y a quelque chose qui cloche.le \ annule la fermeture du string donc il faut metre 2\ pour que le second soit considerer comme un element comprit entre "".notes la coloration syntaxique, visiblement on considere que j'ai pas ferme mon string(meme si j'en porte pas ).
    c'est comme ci tu voulais ecrire un truc du genre salut je suis a' et lui est a" tu ferais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "je suis a' et il est \" "
    .
    si tu avait fait un peu de turbo C tu aurais ete habitue. on avait des trucs sous dos genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f=fopen("c:\\fichier.txt","r");
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

  13. #13
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    Ah oui, le séparateur doit être "échappé".

    Donc, toujours laisser python manipuler les chemins lui-même avec
    os.path.split et os.path.join entre autres.

    merci

  14. #14
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Oui, laisser à os et os.path le travail est une bonne idée.
    Dans le cas présent nous avons un fichier rien.txt qui contient des ligne de type c:\dir\dir\dir\fichier.jpg, soit une représentation d'un chemin absolu Windows.
    Donc si nous utilisons ce fichier sous Windows pas de problème.
    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #
    #
    import os
     
    with open("rien.txt", "r") as inf:
        for line in inf.readlines():
            l = line[:-1]
            if l[-4:].lower() == ".jpg":
                print os.path.basename(l)
                print os.path.split(l)
                chm = l[:-4].split("\\")
                longchm = len(chm) - 1
                f = chm[longchm] + ".txt"
            else:
                with open(f, "a") as outf:
                    outf.write(line)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fichier.jpg
    ('c:\\dir\\dir\\dir', 'fichier.jpg')
    fichier2.JPG
    ('c:\\dir\\dir\\dir', 'fichier2.JPG')
    Mais voila ce que cela donne sous Linux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    c:\dir\dir\dir\fichier.jpg
    ('', 'c:\\dir\\dir\\dir\\fichier.jpg')
    c:\dir\dir\dir\fichier2.JPG
    ('', 'c:\\dir\\dir\\dir\\fichier2.JPG')
    Dans le cas présent, un travail sur le texte même, dans le cadre d'un code compatible, me semble plus rapide que de traiter la ligne puis d'utiliser un module.
    Ou je n'ai rien compris à os, que j'utilise pourtant.

    Bon code.
    Merci d'utiliser le forum pour les questions techniques.

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

Discussions similaires

  1. optimiser le code d'une fonction
    Par yanis97 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/07/2005, 09h41
  2. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 11h29
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    Réponses: 3
    Dernier message: 03/02/2005, 15h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    Réponses: 18
    Dernier message: 12/08/2004, 12h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 11h59

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