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 :

Un petit coup de main pour un débutant en Python


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Actuaire
    Inscrit en
    Juillet 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Actuaire
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 49
    Par défaut Un petit coup de main pour un débutant en Python
    Bonjour tout le monde,

    Je me présente, Guillaume, 34 ans.

    Dans mon travail je suis très souvent amené a programmer en VBA. J'ai donc l'habitude de la programmation, et surtout d'avoir tout de suite sous les yeux ce que je fais ou ce que je veux faire.

    J'ai envie d'apprendre le python, car tot ou tard je travaillerai avec. Je vais bientot commencer une vraie formation dans ma boite, mais en attendant j'essaie d'apprendre sur le tas, pour une utilisation perso.

    Mon premier projet, assez simpliste consisterait à la chose suivante :

    Créer un petit programme qui parcoure un dossier où j'ai stocké des videos dont la date de création va de janvier 2020 à aujourd'hui.

    J'aimerais dans un premier temps parcourir l'ensemble des fichiers pour récupérer les mois et années des fichiers, faire une liste sans doublons de ces derniers et créer des répertoires pour chaque année/mois.

    Puis déplacer les videos dont le format dépasse 12Mo dans le répertoire correspondant à leur année/date de création.

    Sous VBA j'aurais fait la chose suivante :

    Liste dans une variable tableau de 3 colonnes et N lignes, du nom de fichier, année et mois de création.

    Puis extraction des années et mois dans un dictionnaire pour supprimer les doublons,

    création des répertoires

    Parcourir la variable tableau et déplacer en fonction de l'année et du mois en m'aidant surement d'une concaténation.


    Seulement voilà en Python, je suis pas encore à l'aise avec les variables. J'ai pas l'impression que les variables tableau sont aussi simplistes que dans VBA.

    J'ai commencé a écrire un bout de code qui me permet avec un print de visualiser ce que je veux en terme de liste mais ca s'arrête là :

    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
    import os , time
     
    repertoire = 'C:/Users/guill/Desktop/Videos Iphone'
     
    os.chdir(repertoire)
     
    for path, dirs, files in os.walk(repertoire):
            for filename in files:
                date_created_string = time.ctime(os.path.getctime(filename))
                date_created_obj = time.localtime(os.path.getctime(filename))
                size=os.path.getsize(filename) / 1000
                mois=date_created_obj.tm_mon
                annee=date_created_obj.tm_year
     
                if size > 10000 :
                    print(filename, annee,mois,size)

    Auriez vous la gentillesse de m'aider, me guider, pour me dire si déja j'aurais pu faire mieux concernant le code existant, et où me diriger pour mener à bien mon projet?

    Je vous remercie par avance,

    Cordialement,
    Guillaume

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 994
    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 994
    Par défaut
    Bonsoir,

    Pour créer une liste,

    Ajouter un élément dans la liste,


  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 586
    Par défaut
    Salut,

    Citation Envoyé par Methodrone8 Voir le message
    Seulement voilà en Python, je suis pas encore à l'aise avec les variables. J'ai pas l'impression que les variables tableau sont aussi simplistes que dans VBA.
    Avec Python, les variables sont de faux amis et les listes sont des objets: impossible de penser VBA pour coder avec Python et passer du temps dans un tuto. pour apprendre les bases est incontournable. Et si vous savez programmer, ouvrez celui livré avec Python, il est fait pour vous.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 767
    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 767
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Methodrone8 Voir le message
    Bonjour tout le monde,

    Je me présente, Guillaume, 34 ans.
    Bonjour Guillaume

    Citation Envoyé par Methodrone8 Voir le message
    Dans mon travail je suis très souvent amené a programmer en VBA. J'ai donc l'habitude de la programmation, et surtout d'avoir tout de suite sous les yeux ce que je fais ou ce que je veux faire.
    Super. Python c'est pareil => tu scriptes, tu exécutes et tu vois immédiatement le résultat

    Citation Envoyé par Methodrone8 Voir le message
    Mon premier projet, assez simpliste consisterait à la chose suivante :

    Créer un petit programme qui parcoure un dossier où j'ai stocké des videos dont la date de création va de janvier 2020 à aujourd'hui.

    J'aimerais dans un premier temps parcourir l'ensemble des fichiers pour récupérer les mois et années des fichiers, faire une liste sans doublons de ces derniers et créer des répertoires pour chaque année/mois.

    Puis déplacer les videos dont le format dépasse 12Mo dans le répertoire correspondant à leur année/date de création.
    en Python comme dans tout autre langage, le secret c'est diviser pour régner. Perso je partirais sur une fonction qui fait le taf pour "un" fichier ; puis une fois bien réglée je l'appliquerais sur chaque fichier du dossier.

    Citation Envoyé par Methodrone8 Voir le message
    Sous VBA j'aurais fait la chose suivante :

    Liste dans une variable tableau de 3 colonnes et N lignes, du nom de fichier, année et mois de création.
    En Python tu peux créer des listes de tuples. Un tuple c'est n données accolées (ex tpl=(1, 2, 3, "toto", "titi")). Tu peux accéder aux datas individuelles via leur position dans le tuple (la première commence à 0) => tpl[4] donne "toto". Et une liste c'est un tableau de n'importe quoi (donc de tuples éventuellement).
    Donc à partir du fichier un coup de os.stat() pour avoir son état complet, lequel état inclut sa date de création. Tu extrais de cette date aa et mm et tu fous (nom, aa, mm) dans un joli tuple puis le joli tuple dans ta liste et c'est réglé. Ah oui il y a aussi le coup des 12Mo ben t'as aussi la taille dans os.stat().

    Citation Envoyé par Methodrone8 Voir le message
    Seulement voilà en Python, je suis pas encore à l'aise avec les variables. J'ai pas l'impression que les variables tableau sont aussi simplistes que dans VBA.
    Je peux pas te dire, je ne connais pas VBA (enfin j'ai déjà codé des macros mais ça fait super longtemps). Mais bon, un tableau Python (on dit "liste") c'est plutôt assez simple: tu la crées (vide ou pas), puis tu peux lui ajouter facilement via append(). Le seul truc à éviter c'est de boucler dessus si tu la modifies dans la boucle. Mais boucler sur for f in os.listdir(ton_dossier) puis traiter le dossier "f" et de là remplir ton tableau via append() ça ne pose pas de souci.
    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]

  5. #5
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 909
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Juste une petite précision**:
    os.stat(filename).st_ctime ne retournera pas la date de création du filename sur un système de fichier de type unix, mais la date de la dernière modification de ce fichier...

    ** ben oui, il n'y a pas que Windows sur la planète

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 767
    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 767
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    os.stat(filename).st_ctime ne retournera pas la date de création du filename sur un système de fichier de type unix, mais la date de la dernière modification de ce fichier...
    Plus précisément, la ctime (change time) indique le moment où une propriété (ou une métadonnée) du fichier change. Exemple on modifie les droits d'accès (mais sans modifier son contenu) la ctime change quand-même.

    Je pense que la donnée la plus adéquate serait la mtime. Après-tout, il parle de vidéos or une vidéo ne change pas tous les 4 matins donc sa mtime (modification time) devrait représenter assez fidèlement sa date de création. Et comme de toute façon il n'y a pas tellement de choix...

    Mais c'est vrai que parfois ça me manque une vraie date de création, un truc qui serait claqué à la création et qui ne bougerait plus jamais ensuite. Style une "etime" (epoch time)...
    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]

  7. #7
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 909
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Je pense que la donnée la plus adéquate serait la mtime
    Oui effectivement, contrairement à ctime, si je renomme le fichier la date reste la même. Merci de m'avoir repris
    Après-tout, il parle de vidéos or une vidéo ne change pas tous les 4 matins
    en effet

  8. #8
    Membre confirmé
    Homme Profil pro
    Actuaire
    Inscrit en
    Juillet 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Actuaire
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 49
    Par défaut
    Bonjour tout le monde,

    Ravi de trouver toutes ces réponses, je vais suivre vos conseils et vous tient au courant des avancées!

    En effet je pense que la meilleure chose à faire c'est d'y arriver pour un fichier puis se lancer dans les boucles, je vais donc repartir avec cette optique!
    Merci beaucoup et bonne journée tout le monde!

    Guillaume

  9. #9
    Membre confirmé
    Homme Profil pro
    Actuaire
    Inscrit en
    Juillet 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Actuaire
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 49
    Par défaut
    Hello tout le monde

    grace a votre aide et quelques recherches, j'ai pu avancer dans le code,

    J'ai par ailleurs réussi a créer un répertoire via le code, j'aimerais maintenant le faire par itération :

    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
     
    import os , time
     
    repertoire = 'C:/Users/guill/Desktop/Videos Iphone'
     
    os.chdir(repertoire)
     
    filelist=[]
     
    for path, dirs, files in os.walk(repertoire):
            for filename in files:
                taille=os.stat(filename).st_size/1000
                annee=time.localtime(os.stat(filename).st_mtime).tm_year
                mois = time.localtime(os.stat(filename).st_mtime).tm_mon
     
                month_year=(mois,annee)
     
                filelist.append(month_year)
     
     
    def comp(x):
        return [x[1], x[0]]
     
    newlist=sorted(list(set(filelist)),key=comp)
     
    for np in newlist:
        newpath=repertoire + '/'+str(newlist[np][1])+" - "+str(newlist[np][0])
        if not os.path.exists(newpath):
            os.makedirs(newpath)
    Je bloque au for np in newlist, comme newlist est une liste de tuples, le str(newlist[np][1]) ne marche pas :TypeError: list indices must be integers or slices, not tuple

    Comment puis-je indexer newlist pour parcourir proprement chaque élément de ma newlist?

    Merci!

  10. #10
    Invité
    Invité(e)
    Par défaut
    Salut !

    np[0], np[1] all simply !

    Attention à ne pas griller trop d'étapes dans l'apprentissage !

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 767
    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 767
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Methodrone8 Voir le message
    for path, dirs, files in os.walk(repertoire)
    for (path, dirs, files) in os.walk(repertoire) (un tuple s'explicite mieux avec des parenthèses)

    Citation Envoyé par Methodrone8 Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def comp(x):
        return [x[1], x[0]]
     
    newlist=sorted(list(set(filelist)),key=comp)
    newlist=sorted(list(set(filelist)), key=lambda x:[x[1], x[0]]).

    Citation Envoyé par Methodrone8 Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for np in newlist:
        newpath=repertoire + '/'+str(newlist[np][1])+" - "+str(newlist[np][0])
        if not os.path.exists(newpath):
            os.makedirs(newpath)

    Je bloque au for np in newlist, comme newlist est une liste de tuples, le str(newlist[np][1]) ne marche pas :TypeError: list indices must be integers or slices, not tuple
    Normal, "np" n'est pas l'indice de newlist mais directement son contenu. Accessoirement os.path.join() est spécifiquement fait pour créer des chemins => os.path.join(repertoire, "%s - %s" % (np[1], np[0])).

    Citation Envoyé par Methodrone8 Voir le message
    Comment puis-je indexer newlist pour parcourir proprement chaque élément de ma newlist?
    Soit tu crées un indice et tu peux l'utiliser pour accéder aux éléments du tableau => for i in range(len(newlist)): print(newlist[i]).
    Soit tu itères directement sur le tableau et donc tu n'as pas besoin d'utiliser la notation "indice" puisque tu as déjà l'élément qui t'intéresse => for np in newlist: print(np).
    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]

  12. #12
    Invité
    Invité(e)
    Par défaut
    @Sve@r Euh c'est moi où list() ne sert à rien ici :
    newlist=sorted(list(set(filelist)), key=lambda x:[x[1], x[0]])
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> m_y = [(1,2021),(1,2020)]
    >>> sorted(set(m_y),key=lambda x:[x[1], x[0]])
    [(1, 2020), (1, 2021)]

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 767
    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 767
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    @Sve@r Euh c'est moi où list() ne sert à rien ici
    En fait j'ai pas testé. Je voulais juste montrer la possibilité de se passer de la fonction "comp". C'est vrai qu'en lisant son code j'ai un peu réfléchi sur ce list() mais j'ai pensé que ça devait être obligatoire pour traiter le set() interne. J'ai pas pensé que sorted() l'acceptait directement. C'est bien d'avoir testé.
    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]

  14. #14
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 994
    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 994
    Par défaut
    Plus simple pourrait être,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for month, year in newlist:
        # utilisation de month et year

Discussions similaires

  1. Petit coup de main pour une meilleur compréhension
    Par b_sky dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 22/06/2011, 19h51
  2. Petit coup de main pour un petit script
    Par Baradhur dans le forum Linux
    Réponses: 4
    Dernier message: 11/11/2010, 01h38
  3. Petit coup de main pour débuter
    Par Wil14 dans le forum JPA
    Réponses: 2
    Dernier message: 14/04/2010, 12h32
  4. Petit coup de main pour syntaxe
    Par santacrus dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 26/12/2008, 21h11

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