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 :

Lister fichier et propriétaires (windows) [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 366
    Par défaut Lister fichier et propriétaires (windows)
    Bonjour à tous,

    Débutant en Python, je souhaite récupérer la liste des fichiers d'un répertoire, avec certaines infos dont le nom du "propriétaire" du fichier (info système).
    Voici ce que j'ai pour l'instant écrit :
    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
    import os
    from datetime import datetime
     
     
    folder = r'C:\monchemin'
    output = "liste.csv"
     
    with open(output, "w") as a:
        a.write('prop;date_creation;date_modification;fichier;chemin\n')
        for path, subdirs, files in os.walk(folder):
           for filename in files:
             f = os.path.join(path, filename)
             mtime = (os.stat(f).st_mtime)
             ctime = (os.stat(f).st_ctime)
             owner = (os.stat(f).st_uid)
             mtimef = datetime.utcfromtimestamp(mtime).strftime('%Y-%m-%d %H:%M:%S')
             ctimef = datetime.utcfromtimestamp(ctime).strftime('%Y-%m-%d %H:%M:%S')
             if f.endswith(".txt"):
                a.write(str(owner) + ';' + ctimef + ';' + mtimef + ';' + str(filename) + ';' + str(path) + '\n')
    Mais comme on peut le lire ici, la fonction os.stat(f).st_uid ne marche pas sur Windows.
    Il y a bien (a priori) une solution donnée ici, mais mon niveau en Python et en anglais ne me suffisent pas pour arriver à comprendre son utilisation.

    Quelqu'un pourrait-il m'aider à ajouter cette fonction dans mon code ?

    Merci à vous !

  2. #2
    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
    Effectivement la solution donnée sur stackoverflow est assez compliquée.

    En se reposant sur ce qui est proposé nativement sur windows, on peut appeler la commande système suivante depuis python :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import subprocess
     
    strlistdir = subprocess.call('dir /q', shell=True)
    print(strlistdir)
    Chez moi ca donne qqch comme ca :

    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
     Le volume dans le lecteur C s’appelle WINDOWS
     Le numéro de série du volume est 2E2E-4F8F
     
     Répertoire de C:\Program Files\cmder
     
    19/01/2022  15:34    <DIR>          LEPROPRIO             .
    19/01/2022  15:34    <DIR>          LEPROPRIO ..
    18/08/2019  23:36    <DIR>          LEPROPRIO             bin
    18/08/2019  23:36           140*800 LEPROPRIO             Cmder.exe
    18/02/2020  11:26    <DIR>          LEPROPRIO             config
    18/08/2019  23:36    <DIR>          LEPROPRIO             icons
    18/08/2019  23:36             1*069 LEPROPRIO             LICENSE
    18/08/2019  23:36    <DIR>          LEPROPRIO             vendor
    18/08/2019  23:36                 0 LEPROPRIO             Version 1.3.12.915
                   3 fichier(s)          141*869 octets
                   6 Rép(s)  36*762*845*184 octets libres
    0
    Vous pouvez ensuite parser cette chaine de caractère.


    Autre possibilité, que je n'ai pas testé mais qui semble fonctionner, c'est d'installer le package pywin32 et ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import win32security
     
    def GetOwner(filename):
        f = win32security.GetFileSecurity(filename, win32security.OWNER_SECURITY_INFORMATION)
        (username, domain, sid_name_use) =  win32security.LookupAccountSid(None, f.GetSecurityDescriptorOwner())
        return username
     
    print GetOwner(r"\\some_shared_location\somefile.txt")

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 366
    Par défaut
    Merci @lg_53

    Je vais tenter la solution , mais comme le script va être lancé sur un répertoire de plusieurs milliers de fichiers, j'ai peur que ce soit risqué/lourd ?

    Pour le package pywin32, je lisais que certains étaient réticents à l'installer : tu as une idée de pourquoi ?
    (désolé, je ne connais pas encore très bien l'univers des package Python. D'ailleurs une question bonus : "packages", "modules" sont bien des synonymes ? )

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 366
    Par défaut
    Pour le package "win32security", je ne peux pas l'installer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    U:\>python -m pip install win32security
    ERROR: Could not find a version that satisfies the requirement win32security (from versions: none)
    ERROR: No matching distribution found for win32security
    Ça a fonctionné par contre avec python -m pip install pywin32Mais si je tente de l'utiliser dans mon script, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "C:\chemin\script.py", line 3, in <module>
        import pywin32
    ModuleNotFoundError: No module named 'pywin32'
    ou si je mets import win32security
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "C:\chemin\script.py", line 3, in <module>
        import win32security
    ModuleNotFoundError: No module named 'win32security'

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 366
    Par défaut
    C'est bon, j'ai trouvé : ça marche si j’exécute Python en tant qu'administrateur !

  6. #6
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    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 : 923
    Billets dans le blog
    8
    Par défaut
    Bonjour,

    Citation Envoyé par lg_53 Voir le message
    Effectivement la solution donnée sur stackoverflow est assez compliquée.

    En se reposant sur ce qui est proposé nativement sur windows, on peut appeler la commande système suivante depuis python :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import subprocess
     
    strlistdir = subprocess.call('dir /q', shell=True)
    print(strlistdir)
    Chez moi ca donne qqch comme ca :

    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
     Le volume dans le lecteur C s’appelle WINDOWS
     Le numéro de série du volume est 2E2E-4F8F
     
     Répertoire de C:\Program Files\cmder
     
    19/01/2022  15:34    <DIR>          LEPROPRIO             .
    19/01/2022  15:34    <DIR>          LEPROPRIO ..
    18/08/2019  23:36    <DIR>          LEPROPRIO             bin
    18/08/2019  23:36           140*800 LEPROPRIO             Cmder.exe
    18/02/2020  11:26    <DIR>          LEPROPRIO             config
    18/08/2019  23:36    <DIR>          LEPROPRIO             icons
    18/08/2019  23:36             1*069 LEPROPRIO             LICENSE
    18/08/2019  23:36    <DIR>          LEPROPRIO             vendor
    18/08/2019  23:36                 0 LEPROPRIO             Version 1.3.12.915
                   3 fichier(s)          141*869 octets
                   6 Rép(s)  36*762*845*184 octets libres
    0
    Je suis surpris de ton retour, car chez moi (en utilisant ls -l car je suis sur linux) j'ai pour retour O (ce qui correspond au returncode d'une execution réussi). J'ai regardé la doc, et c'est bien le returncode qui est attendu...
    Par contre ceci fonctionne(à adapter pour win):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import subprocess
     
    process = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE, encoding='UTF-8')
    print(process.communicate())
     
    print(subprocess.check_output(["ls", "-l"], encoding='UTF-8'))
     
    print(subprocess.run(["ls", "-l"], capture_output=True, encoding='UTF-8'))

  7. #7
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    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 : 923
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par SylvainM Voir le message
    mais mon niveau en Python et en anglais ne me suffisent pas pour arriver à comprendre son utilisation.
    Perso, j'ai un tout petit niveau en anglais(mais qui au gré de mes recherches s'améliore doucement, mais surement) et quand il n'y a pas de ressource en français sur le sujet qui m'intéresse, j'ai souvent recours à https://www.deepl.com/fr/translator un traducteur que je trouve particulièrement efficace pour traduire de l'anglais technique en français.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 366
    Par défaut
    Bon, même si c'est du niveau "grand débutant", je partage mon code final :
    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
    import os
    from datetime import datetime
    import win32security
     
    # dossier à scanner :
    folder = r'C:\chemin\dossier'
    # fichier en sortie :
    output = "liste.csv"
    # Liste des extensions à scanner
    ExtList = ['txt','bat']
     
    # Fonction pour récupérer le propriétaire du fichier : (avec win32security / pywin32)
    # attention : ne marche qu'en tant qu'administrateur !
     
    def GetOwner(filename):
        f = win32security.GetFileSecurity(filename, win32security.OWNER_SECURITY_INFORMATION)
        (username, domain, sid_name_use) =  win32security.LookupAccountSid(None, f.GetSecurityDescriptorOwner())
        return username
     
    # Scan du dossier
    print("Lancement du Scan")
    with open(output, "w") as a:
        a.write('type;proprietaire;date_creation;date_modification;fichier;chemin\n')
        for path, subdirs, files in os.walk(folder):
           for filename in files:
             f = os.path.join(path, filename)
             ext = str(filename[-3:])
             mtime = (os.stat(f).st_mtime)
             ctime = (os.stat(f).st_ctime)
             owner = GetOwner(f)
             mtimef = datetime.utcfromtimestamp(mtime).strftime('%Y-%m-%d %H:%M:%S')
             ctimef = datetime.utcfromtimestamp(ctime).strftime('%Y-%m-%d %H:%M:%S')
             if ext in ExtList:
                 a.write(ext + ';' + str(owner) + ';' + ctimef + ';' + mtimef + ';' + str(filename) + ';' + str(path) + '\n')
    print("Fin du Scan")
    Je vois tout de suite qu'il y a une amélioration à faire pour l'extension : je prends les 3 derniers caractères du filename, alors que les extensions peuvent être plus longues.
    Mais dans mon cas, ce n'était pas l'objet de ma recherche.

    Mais si vous voyez des optimisations, je suis bien évidemment preneur

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 366
    Par défaut
    J'ai trouvé pour l'extension !
    ext = os.path.splitext(filename)[1][1:][edit]
    Ou encore plus simple :
    ext = filename.split(".", 1)[1](oui oui, j'apprends en direct )

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par SylvainM Voir le message
    Ou encore plus simple
    Il faut se méfier de ce qu'on croit "plus simple". Certains fichiers ont par exemple plusieurs extensions (exemple "toto.tar.xz"). Comment va se comporter ton "plus simple" ?
    os.path contient des outils dédiés à la gestion des noms, autant passer par lui.
    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]

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

Discussions similaires

  1. [Python 3.X] Lister fichiers par FTP pour les stocker dans une Listview idem explorateur Windows
    Par Supernatural dans le forum Général Python
    Réponses: 19
    Dernier message: 10/10/2018, 11h09
  2. Conversion d'un fichier dos vers windows ?
    Par elitost dans le forum Windows
    Réponses: 4
    Dernier message: 10/02/2005, 17h42
  3. Afficher un fichier binaire sous Windows
    Par Atomikx dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 14/12/2004, 00h29
  4. [C#] [Winforms] Explorateur de fichier et icônes windows
    Par Cl@rk dans le forum Windows Forms
    Réponses: 5
    Dernier message: 03/12/2004, 09h11
  5. Les fichiers sous linux/windows
    Par Stessy dans le forum Linux
    Réponses: 5
    Dernier message: 05/12/2003, 09h30

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