[Python] Parcourir un dossier

Bonjour à tous
Je voudrais savoir comment je pourrais faire pour créer un bouton (ça je sais le faire....) qui recrée la fonction "Parcourir". Je voudrais pourvoir récupérer tous les fichiers '.py' d'un dossier pour en extraire toutes les donées (ça je sais le faire aussi).
Il me manque juste la foncion "Parcourir".
D'après ce que j'ai pu lire sur le net, doit falloir installer d'autres bibliothèques ais je ne sais pas lesquelles.
Si quelqu'un avait une ch'tite idée, ce serait sympa.
Merci beaucoup

16 réponses

Résumé de la discussion

Création d'un bouton Parcourir permettant de reproduire la fonction de sélection de fichier et d'extraire des données à partir des fichiers '.py' d'un dossier, tout en cherchant quelles bibliothèques installer. La solution pratique évoquée consiste à utiliser Tkinter avec le module tkFileDialog, notamment askopenfilename(), pour obtenir le chemin du fichier sélectionné et le traiter ensuite. Des explications précisent que filename contient le nom du fichier et que le dialogue se ferme après Ok, tandis que d'autres échanges portent sur la gestion des fenêtres Tk et des erreurs éventuelles. D'autres recommandations suggèrent de réorganiser le flux du programme: dialogue de sélection fichier avant le calcul principal, afin d'éviter une fenêtre Tk persistante et des erreurs inattendues.

Bobot (l’IA à votre service)
  1. Modérateur
    Tu utilises quel libairies graphique ?

    Tkinter ?

    Dans ce cas, il n'y a rien à installer de plus: C'est installé en standard avec Python.

    Pour tkinter, il y a des dialogue prédéfinis assez faciles à utiliser.
    J'ai mis des exemples là:
    https://sebsauvage.net/python/snyppets/index.html#tkinter_dialogs
    1. Salut seb
      Oui j utilise Tkinter
      Merci pour le lien
      Y'a beaucoup de choses à lire donc je m'y mets de suite
  2. J'ai une petite question concernant le code suivant :
    "file = tkFileDialog.askopenfile(parent=root,mode='rb',title='Please select a file')
    if (file != None) :
    file_to_read = file
    print file_to_read
    data = file.read()
    file.close()"

    Y'a pas une solution qui me permettrait de ne récupérer que le nom du fichier sélectionné plutôt que cette ligne là :
    "<open file '/home/aurelien/devel/python/test/test1.mdm', mode 'rb' at 0xb620d968>".
    Parce que je voudrais utliser le nom de fichier sélectionné dans un de mes codes mais avec cette syntaxe là, forcément ça plante.
    Merci
    1. Modérateur
      Il me semble que c'est tkFileDialog.askopenfilename()

      exemple:
      import Tkinter
      import tkFileDialog
      
      root = Tkinter.Tk()
      filename = tkFileDialog.askopenfilename(parent=root,title='Please select a file')
      print filename
      1. En fait cette fonction renvoit le chemin du dossier sélectionné.
        Mais ce sera parfait pour ce que je fais.
        Merci encore
      2. Désolé mais je suis vraiment nul...
        Je ne peux plus fermer la fenêtre maintenant .
        Il me dit : "AttributeError: 'str' object has no attribute 'close' "

        Comment je peux faire?
        Merci
    2. Modérateur
      Mon ton code ?
      1. Voila mon code
        J'importe un module que j'ai créé (et qui fonctionne) et je passe le nom du fichier sélectionné dans ma fonction Read_file().
        Une fois que ma fonction Read_file() est terminée, j'aimerais que l'explorateur de fichier se ferme.
        Mais quand je fais "filename.close()" j'ai l'erreur "AttributeError: 'str' object has no attribute 'close' "

        import Tkinter
        import tkFileDialog
        from Open_file import *

        i = 0
        root = Tkinter.Tk()
        filename = tkFileDialog.askopenfilename(parent=root,title='Please select a file')
        if (filename != None) :
        Read_File(filename)
        filenale.close()
    3. Modérateur
      filename c'est le nom du fichier (une chaîne de caractères).

      ça n'est pas un object "fichier" qu'on peut fermer avec un .close().
      1. OK
        Mais comment je peux faire pour
        1) Récupérer le nom du fichier sélectionné
        2) Appeler ma fonction avec le nom du fichier
        3) Fermer l'explorateur de fichier

        ?
        Pour la 3), faut que je revienne dans ma fonction principale, pour pouvoir fermer la fenetre?
    4. Modérateur
      1)
      filename = tkFileDialog.askopenfilename(parent=root,title='Please select a file')

      filename contient le nom du fichier sélectionné.

      2)
      mafonction(filename)

      3)
      Tu n'a rien à fermer.
      Dès que l'utilisateur clic sur "Ok", la foinction askopenfilename() ferme la fenêtre de dialogue et te donne le nom du fichier.
      1. Je suis d'accord pour la 1) et la 2), mais une fois que j'ai choisi le fichier à ouvrir, et que ma fonction a fait le traitement, il reste une fenêtre tk (qui n'a rien a voir avec l'explorateur de fichier).
      2. Par contre quand je clique sur annuler, elle se ferme automatiquement
    5. Modérateur
      il reste une fenêtre tk

      Si c'est toi qui a ouvert la fenêtre tk, c'est à toi de la fermer.

      Si veux que ton programme quitte, il faut faire sys.exit(0)
      1. OK
        Mais d'où elle vient cette fenêtre?
        Je ne l'ai pas ouverte....
    6. Modérateur
      Ben c'est bizarre, parceque moi quand je fais:

      import Tkinter
      import tkFileDialog
      root = Tkinter.Tk()
      filename = tkFileDialog.askopenfilename(parent=root,title='Please select a file')
      print filename

      Je n'ai aucune fenêtre qui reste.

      Quelquepart dans ton programme, il n'y a pas une ligne contenant un appel à .mainloop() ?
      1. Avec ton code, j'ai une fenetre tk qui apparait derriere l explorateur, mais des que je clique sur OK, elle disparait.

        Petite précision, je travaille sous Linux
    7. Modérateur
      Avec ton code, j'ai une fenetre tk qui apparait derriere l explorateur, mais des que je clique sur OK, elle disparait.

      Ben c'est pas ce que tu voulais ?
      Que la fenêtre disparaisse une fois le fichier sélectionné ?
      1. Si, c'est ce que je voulais. Mais avec mon code, la fenetre tk reste toujours.
        "import Tkinter
        import tkFileDialog
        from Open_file import *

        root = Tkinter.Tk()
        filename = tkFileDialog.askopenfilename(parent=root,title='Please select a file')
        Read_File(filename)"

        J ai vérifié, je n'ai pas de .mainloop dans mon module.
        Je ne comprends pas
    8. Modérateur
      J'ai fait la même chose, mais quand j'ai terminé de sélectionner le fichier, la fenêtre se ferme.

      Si ta fenêtre reste ouvert, ça veut dire que ta fonction Read_File() n'est pas encore terminée.

      La fenêtre est obligatoire car toute fenêtre tkinter (ou fenêtre de dialogue) a besoin d'une fenêtre mère.
      S'il n'y en a pas, tkinter en créé une.
      1. Ma fonction Read_file() affiche une courbe.
        Elle ne se termine donc que lorsque je ferme le graphe.
        Mais à ce moment là, la fenêtre tk ne se ferme pas.
    9. Modérateur
      C'est ta fonction Read_File() qui doit poser problème.
      Je ne sais pas ce qu'elles contient, je ne peux donc pas te dire ce qui cloche dedans.
      1. Bon OK
        Merci pour toutes ces réponses
        Je vais essayer de trouver ce qui merde.
    10. Modérateur
      Cause probables au problème:

      - Soit ta fonction Read_File() n'est pas terminée.
      - Soit elle utilise elle-aussi des fonctions tkinter (ce qui est fort possible si tu utilise pylab/matplotlib dedans).
      1. Pour ma fonction Read_file, je n'utilise que les bibliothèques math et pylab, pas Tkinter.
        Et elle se termine quand je ferme le graphe.
        Donc a priori, quand je ferme le graphe, ma fonction principale ne reprend pas la main et ne peut pas fermer la fenetre Tk.
        C'est ça?
      2. Modérateur
        @Utilisateur anonymeC'est ça !

        Je te conseillerais de réorganiser ton code:

        Actuellement, c'est la routine qui affiche la fenêtre de sélection du fichier qui appelle le programme principale (celui qui calcul et affiche les fenêtres):

        dialogue sélection fichier ----> lecture données et affichage.

        ça devrait être l'inverse:

        Programme principal -----> dialogue sélection fichier
        calcul
        affichage.
      3. @sebsauvageOK
        je vais essayer de changer ça
        merci encore
      4. @sebsauvageBon l'essai n'st pas concluant
        J'ai importé ma fonction d'exploration de fichier dans le code qui fait toutela procédure de calcul.
        Mais la fenêtre Tk est toujours là.
        Je me demande s'il n'y a pas un conflit avec la fonction show() de pylab.
    11. Modérateur
      Je me demande s'il n'y a pas un conflit avec la fonction show() de pylab.

      C'est possible.

      A mon avis:

      Ton programme n'a pas de fenêtre principal, donc quand pylab/matplotlib veut faire un graphe, il créé sa propre fenêtre principale (et tu n'a donc aucun contrôle dessus).

      Tu doit créer la fenêtre principale (root) pour pouvoir la fermer.
      1. C'est vrai que je n'ai pas créé de fenêtre principale. Voila mon code d'affichage:
        "def Trace_Graphe(matrice, param, nb_line_param) :
        x_start = min(matrice[param[0]])
        x_end = max(matrice[param[0]])
        y_start = min(matrice[param[3]])
        y_end = max(matrice[param[3]])

        axe1 = subplot(111)
        semilogy(matrice[param[0]], matrice[param[3]], 'r')
        axis([x_start, x_end, y_start, y_end])
        xlabel(param[0])
        ylabel(param[3])

        axe2 = twinx()
        semilogy(matrice[param[0]], matrice[param[2]], 'b')
        ylabel(param[2])
        axe2.yaxis.tick_right()
        show()"

        Faudrait que je la créé à quel niveau?
        Et comment l'utiliser?
        Merci
    12. Modérateur
      Je n'ai pas le temps de regarder, mais dans les exemples:
      http://matplotlib.sourceforge.net/matplotlib_examples_0.87.1.zip

      Il y a 2 exemples avec tkinter:
      embedding_in_tk.py
      embedding_in_tk2.py

      En gros, tu créé ta fenêtre, tu créé le widget matplotlib en lui donnant comme parent ta fenêtre.

      Comme ça tu as un contrôle total.
      1. Modérateur
        En fait, pylab est une version trop simplifiée de matplotlib qui s'occupe de beaucoup de choses, comme la gestion des fenêtres (le fameux show()).

        Donc, on a pas le contrôle de tout ça.

        Il faut utiliser matplotlib.
        1. D'accord merci beaucoup pour ces nombreuses réponses
        2. salut,
          je voudrais savoir si il y a un moyen de recuperer la liste des fichier contenu dans un dossier SVP?
      2. bonjour,
        j'en ai exactement le meme probleme que toi. j'arrive pas a fermer la fenetre tk. est-ce que t'as trouve la solution, stp? merci