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 :

Correction d'un script


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Secteur automobile
    Inscrit en
    Octobre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Secteur automobile

    Informations forums :
    Inscription : Octobre 2017
    Messages : 9
    Par défaut Correction d'un script
    Bonjour,

    J'ai besoin d'aide pour corriger un script qu'un gars sympa m'a fait sur un autre forum il y a 1 an. Je n'avais pas pu le tester avant hier soir faute de PC sous Windows.

    Voici ce que je lui avais donné comme cahier des charges :

    Un petit programme ou batch à exécuter dans un dossier qui contient des epub et pdf.

    Epub nommés sous la forme : Nom, Prénom - Titre (année)

    En exécutant le prog, il doit lire les titres des epub et pdf, vérifier qu'un dossier de chaque auteur n'existe pas déjà et créer un dossier sous la forme Nom, Prénom (nombre de fichiers du même auteur).

    Il faut qu'il lise la chaîne de caractère avant le premier " - " ou éventuellement avant le premier " & " ou " et " du nom si auteurs multiples. Attention aux noms composés avec un tiret (sans espace du coup).


    Voici un exemple :

    Fichiers présents dans le dossier :

    Pépère, Lise & Robert, Jacques - Trouvailles (2012)
    Piglia, Ricardo - Argent brûlé.epub
    Piglia, Ricardo - Pour Ida Brown.epub
    Pignat, Caroline - Les amoureux de l'Empress (2015).epub
    Pigozzi, Caroline - Le vatican indiscret.epub
    Pincon, Monique et Michel - La violence des riches.epub
    Pineau-Valencienne, Valérie - Une cicatrice dans la tête.epub

    Dossiers crées par l'éxecution du programme :

    Pépère, Lise (1)
    Piglia, Ricardo (2)
    Pignat, Caroline (1)
    Pigozzi, Caroline (1)
    Pincon, Monique (1)
    Pineau-Valencienne, Valérie (1)


    Si dossier déjà existant, il doit déplacer les fichiers concernés dans les bons dossiers et incrémenter le chiffre entre parenthèses en conséquence (nombre de livres).


    Voir son script en pièce jointe.

    Il ne fonctionne pas, je le mets dans le dossier à trier, le lance, il me demande de valider le chemin du dossier, démarre et se ferme aussitôt après la création d'un seul dossier... sans même avoir mis de fichier dedans...

    Si un pro de python peu me trouver l'erreur je suis preneur, n'y comprenant strictement rien en programmation...

    Merci d'avance.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Si vous n'y comprenez rien en programmation et que vous ne souhaitez pas vous y mettre, cela va être compliqué : maintenance de l'install, maj des versions, corrections des bugs, ...
    A mon avis, aucun intérêt à utiliser un programme python.
    Pour ce qui est du programme, je ne vais jamais voir les fichiers attachés : il y a des balises de code (#) pour poster les programmes.
    Bonne fin de semaine.

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Si le dossier que vous avez tapé n'existe pas alors comme est fait le programme, et bien ca ne vous dit rien et ca ne fais rien. Donc je dirais que le dossier taper n'est pas un dossier qui existe ....

    Qui plus est quand on applique des programmes sur une arborescence de fichier, avoir des espaces dans les noms de fichiers n'est jamais une bonne idée.

    Et sinon si c'est juste pour faire de la gestion de bibliographie, il y a des utilaires qui fonctionne très bien, comme Zotero par exemple.

  4. #4
    Membre du Club
    Homme Profil pro
    Secteur automobile
    Inscrit en
    Octobre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Secteur automobile

    Informations forums :
    Inscription : Octobre 2017
    Messages : 9
    Par défaut
    Le but est tout simple, créer des dossiers "noms auteurs (nbr fichiers)" et déplacer/ranger mes epub et pdf. Je le fais à la main mais c'est très long...

    Une fois que le script fonctionnera pas besoin de le faire évoluer ni de mises à jour.

    Ce n'est pas une bibliographie (Zotero) mais juste un tri/déplacement. Mes fichiers sont dans des dossiers A, B, C, D... et je veux les ranger par auteurs...

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    import os,sys
    from shutil import copyfile
     
    filelist=[]
    pathepub=""
    pathfile=[]
    pathfileexistant=[]
     
    temp=os.path.realpath(__file__).replace("\\", "/").rsplit("/",1)
    argument1= temp[0]
     
    print ("Repertoire en cours : " + argument1)
     
    question = (input ("Est ce le bon repertoire? O ou o puis entrée pour continuer  \n"))
    if question == "O" or question == "o":
        print ("Repertoire défini : " + argument1)
    else:
        argument1=""
        argument1=(input('Tapez le chemin vers les epub ou rien pour sortir : (comme J:\\stock\\ebook )\n')).replace("\\", "/")
     
     
    if not len(argument1):
        sys.exit()
    else: print ("Repertoire utilisé : " + argument1)
     
     
     
     
    if os.path.isdir(argument1):
            pathepub=argument1.replace("\\", "/")
            fileindir = os.listdir(argument1)  
            for file in fileindir:
     
                if os.path.isfile(pathepub+"/"+file) and ( file.endswith(".epub") or file.endswith(".EPUB") or file.endswith(".pdf") or file.endswith(".PDF"))  :
                    filelist.append(file)
                    if file.find("-")>0:
                        tempsplit=file.rsplit("-",1)
                        if tempsplit[0].find("et"):
                                temp = tempsplit[0].split("et")
                                pathfile.append(pathepub + "/" + temp[0])
     
                        else:
                            if tempsplit[0].find("&") :
                                  temp = tempsplit[0].split("&")
                                  pathfile.append(pathepub + "/" + temp[0])
                            else: pathfile.append(pathepub + "/" + tempsplit[0])
     
                    else: pathfile.append(pathepub + "/" + "xxxxx_Sans_tiret_xxxxxx")
     
                if os.path.isdir(pathepub+"/"+file):
                     pathfileexistant.append(pathepub + "/" + file)              
     
     
     
     
    if not len(filelist): 
        sys.exit()
     
    ligne=0
    for epubfile in filelist:
        fait=True
        if (len (pathfileexistant)):
            for pathexistant in pathfileexistant:
                if pathexistant.find("[")>0 and fait:
     
                    temp = pathexistant.split("[")
                    if (temp[0] == pathfile[ligne]):
     
                        copyfile(pathepub + "/" + epubfile, pathexistant + "/" + epubfile)
                        ligne+=1
                        fait=False
     
        if (fait):
            os.makedirs(pathfile[ligne], exist_ok=True)
     
            copyfile(pathepub + "/" + epubfile, pathfile[ligne] + "/" + epubfile)
            print(epubfile + "  copié dans :  " + pathfile[ligne] + "/" + epubfile)
            ligne+=1
     
     
     
     
    listerep = os.listdir(pathepub)
    for rep in listerep:
        if os.path.isdir(pathepub+"/"+rep):
            listefile = os.listdir(pathepub+"/"+rep)
            nbepub = (len (listefile))
            if rep.find("[")>0:
                temp=rep.split("[")
                os.rename(pathepub+"/"+rep, pathepub+"/"+temp[0]+"["+ str(nbepub)+"]")
                print ("Répertoire recompté : " + pathepub+"/"+temp[0]+"["+ str(nbepub)+"]")
            else :
                os.rename(pathepub+"/"+rep, pathepub+"/"+rep+"["+ str(nbepub)+"]")
                print ("Répertoire crée: " + pathepub+"/"+rep+"["+ str(nbepub)+"]")
            nbepub=0
     
     
     
    print ("Nombre de fichier epub copiés  : " + str(ligne))
     
    input()

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 815
    Billets dans le blog
    1
    Par défaut
    Bonjour

    On ne va pas te faire ton code car ce n'est pas le but du forum (et en plus quand je vois ton pâté...).
    Mais on peut t'aider à aller plus vite pour que tu fasses le tien.
    Déjà tu as des fichiers dans ton dossier de départ. Il faut donc que tu les lises et les traite un par un => for f in os.listdir("dossier_de_depart").
    Ce traitement c'est quoi ? C'est couper le nom sur le tiret (en espérant qu'il n'y en a qu'un seul). Ce qui est avant le tiret c'est l'auteur, ce qu'il y a après c'est le titre => (auteur, titre)=f.split("-") ou mieux (auteur, titre)=(x.strip() for x in f.split("-")) (cette seconde écriture supprime en plus de "auteur" et "titre" les espaces placés avant et après les caractères utiles).
    Ensuite un test pour savoir si le dossier correspondant à l'auteur existe et création s'il n'existe pas. Là il y a un petit écueil car ton dossier contient aussi entre parenthèses le nombre de documents placés à l'intérieur. Pour moi, cette info est peu utile et fait plus chier qu'autre chose mais si tu y tiens il te faut écrire alors une petite fonction permettant de dire que par exemple la chaine "Pépère, Lise & Robert, Jacques" correspond bien à la chaine "Pépère, Lise & Robert, Jacques (nnnn)" (c'est souvent pratique les petites fonctions permettant ensuite de factoriser rapidement un traitement un peu complexe et répété).
    Ensuite tu copies/déplaces le fichier dans le dossier concerné et (si tu tiens toujours à ton petit compteur) alors faut renommer le dossier.

    Quelques conseils:
    • il existe la variable os.sep qui contient le séparateur de chemin de ton OS (slash sous Unix, backslash sous Windows)
    • il existe la fonction os.path.join() qui permet de créer un chemin en rajoutant automatiquement le séparateur adéquat => os.path.join("x", "y", "z") va créer le chemin "x/y/z" (ou "x\y\z") et os.path.join(os.sep, "x", "y", "z") créera le chemin "/x/y/z"
    • le test question == "O" or question == "o" s'écrira plutôt question in "oO"
    • le test file.endswith(".epub") or file.endswith(".EPUB") or file.endswith(".pdf") or file.endswith(".PDF") pourrait s'écrire file[file.rfind("."):].lower() in (".epub", ".pdf") (un peu complexe (je récupère de "file" ce qu'il y a après le dernier ".", le converti en minuscules et ensuite regarde si ça correspond aux chaines voules) et ne fonctionne qu'à la condition qu'il y ait vraiment un "." dans la variable "file")
    • toutes tes créations complexes de chaine style pathepub+"/"+temp[0]+"["+ str(nbepub)+"]" peuvent s'écrire plus simplement "%s/%s[%s]" % (pathepub, temp[0], str(nbepub)) ou bien "{0}/{1}[{2}]".format(pathepub, temp[0], str(nbepub)).
    • essaye d'utiliser les arguments du programme comme info plutôt que les demander après. Si par exemple ton code se nomme "pgm.py" et que tu veux traiter le dossier "toto", ce sera plus pratique d'appeler "pgm.py toto" que d'appeler "pgm.py" et d'attendre que le programme te demande "quel dossier voulez-vous traiter" pour répondre "toto". Déjà c'est bien plus pratique à l'utilisation et en plus, dans ce dernier cas tu ne peux traiter qu'un truc alors qu'en utilisant le système des arguments tu peux traiter en répétitif plusieurs dossiers d'affilée (ex "pgm.py toto titi tata"). Les arguments du programme sont placés dans un tableau nommé sys.argv (avec sys.argv[0] correspondant au nom du programme lui-même et la suite des arguments "utilisateurs" étant donc placés dans sys.argv[1], sys.argv[2], ...)


    Citation Envoyé par SamSuffy Voir le message
    Si un pro de python peut me trouver l'erreur je suis preneur, n'y comprenant strictement rien en programmation...
    Ah ben c'est comme pour tout. Si tu veux le faire toi-même faut t'y mettre (l'ignorance est de courte durée, la connaissance reste à vie). Et si tu ne veux pas le faire alors faut payer une prestation (moi je n'y comprends strictement rien en plomberie et donc quand j'ai un souci de cette nature, je fais appel à un pro de la plomberie que je paye ensuite).

    pour corriger un script qu'un gars sympa m'a fait sur un autre forum il y a 1 an.
    Sympa le gars. Pas super efficace, mais sympa. T'as tenté de retourner sur cet autre forum ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre extrêmement actif
    Profil pro
    Développeur
    Inscrit en
    Mars 2012
    Messages
    1 970
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 970
    Par défaut
    Etre programmeur ne se résume pas à faire des copier/coller de codes d'internet.
    Ce serait bien trop simple

Discussions similaires

  1. ReCaptcha: Tout correctement installé mais script non-exécuté (pas de message d'erreur)
    Par vhenin dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 11
    Dernier message: 22/02/2012, 21h46
  2. demande d'aide pour correction d'un script
    Par maikess dans le forum VBScript
    Réponses: 3
    Dernier message: 03/09/2010, 14h34
  3. Optimisation et correction d'un script
    Par xess91 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 18/08/2010, 15h01
  4. correction de script
    Par donmamio dans le forum Langage
    Réponses: 1
    Dernier message: 03/05/2006, 12h25

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