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 :

Exécuter des commandes sur un ensemble de fichiers d'un répertoire


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    etudiant
    Inscrit en
    Avril 2018
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2018
    Messages : 56
    Points : 32
    Points
    32
    Par défaut Exécuter des commandes sur un ensemble de fichiers d'un répertoire
    Bonjour,

    je souhaites réliser une suite de commande sur un ensemble de fichier qui se trouvent dans un répertoire.
    Mes commandes marchent bien car on lui précise un fichier mais impossible de lui faire comprendre que je
    souhaite réaliser ces étapes sur un ensemble de fichier présents dans un répertoire.

    Voilà ce que je propose :

    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
     
     
    #!/usr/bin/python
    # -*- coding: <utf-8> -*-
     
    import os
    import requests
     
     
     
    for element in os.listdir('/dossier/ou/se/trouve/fichiers'):
      if element.endswith('.txt'):
        #file = open("rsID.txt", "r")
        file = os.open("%element.txt", "r")
        for rs in file:
          r = requests.post(
                          url='https://biit.cs.ut.ee/gprofiler/api/snpense/snpense/',
                          json={
                          'organism':'hsapiens',
                          'query': rs
                          }
                          )
          if not r.json()['result'] :
            print (rs,"NA")
          else :
            print (rs,r.json()['result'])
        file.close()
    Merci

  2. #2
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Tu réalises que tu ouvres toujours le même fichier ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        file = os.open("%element.txt", "r")
    et tu as vraiment un fichier nommé %element.txt ?

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Pour trouver et traiter tous les fichiers type "*.txt" d'un répertoire, je te suggère d'utiliser plutôt la fonction iglob du module glob.

    Essaie ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    from glob import iglob
    repertoire = r"/dossier/ou/se/trouvent/les/fichiers"
    motif = "*.txt"
    for fichier in iglob(os.path.join(repertoire, motif)):
        if os.path.isfile(fichier):    
            print(fichier)
    L'un des problèmes de ton code est que os.listdir renvoie les noms trouvés sans leur chemin.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    etudiant
    Inscrit en
    Avril 2018
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2018
    Messages : 56
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Tu réalises que tu ouvres toujours le même fichier ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        file = os.open("%element.txt", "r")
    et tu as vraiment un fichier nommé %element.txt ?
    Bonjour,

    non, je n'ai aucun fichier nommé %element.txt mais je pensais qu'en faisant cela, il comprendrais que je souhaitai traiter tous les fichiers (que j'ai surnommé element) préset dans un même dossier (faire comme une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in *.txt print $i
    en bash).

    je pensais que en python correspondait à en bash.

  5. #5
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Je me disais aussi.

    Utilise la solution de Tyrtamos et ça ira tout seul.

  6. #6
    Nouveau membre du Club
    Femme Profil pro
    etudiant
    Inscrit en
    Avril 2018
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2018
    Messages : 56
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Pour trouver et traiter tous les fichiers type "*.txt" d'un répertoire, je te suggère d'utiliser plutôt la fonction iglob du module glob.

    Essaie ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    from glob import iglob
    repertoire = r"/dossier/ou/se/trouvent/les/fichiers"
    motif = "*.txt"
    for fichier in iglob(os.path.join(repertoire, motif)):
        if os.path.isfile(fichier):    
            print(fichier)
    L'un des problèmes de ton code est que os.listdir renvoie les noms trouvés sans leur chemin.
    Mais à ce moment là, comment lui dire d'ouvrir le fichier en lecture ?

  7. #7
    Nouveau membre du Club
    Femme Profil pro
    etudiant
    Inscrit en
    Avril 2018
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2018
    Messages : 56
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Je me disais aussi.

    Utilise la solution de Tyrtamos et ça ira tout seul.
    Mais je ne comprend pas comment ouvrir chaque fichier en lecture (open) ? avec un file = open(fichier, "r") ?

  8. #8
    Nouveau membre du Club
    Femme Profil pro
    etudiant
    Inscrit en
    Avril 2018
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2018
    Messages : 56
    Points : 32
    Points
    32
    Par défaut
    Je vous remercie énormément de votre aide VinsS et surtout tyrtamos pour votre aide et vos réponses.

    Le script à l'air de marché grâce à ce que vous avez proposé !

    Merci !

  9. #9
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 471
    Points : 6 110
    Points
    6 110
    Par défaut
    Bonjour,

    Pour parcourir les enfants directs d'un dossier, depuis Python 3.5, la fonction à choisir par défaut est os.scandir, introduite par la PEP 471.

    Exemple de code :
    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
    import os
    from typing import Iterable
     
    def main() -> None:
        for file_path in get_direct_children_file_paths_with_extension(dir_path='.', extension='.txt'):
            print(file_path)
     
    def get_direct_children_file_paths_with_extension(dir_path: str, extension: str) -> Iterable[str]:
        return filter(
            lambda path: path.endswith(extension),
            get_direct_children_file_paths(dir_path))
     
    def get_direct_children_file_paths(dir_path: str) -> Iterable[str]:
        return (entry.path for entry in os.scandir(dir_path) if entry.is_file())
     
    if __name__ == '__main__':
        main()
    Autre version du code plus facile à comprendre quand on débute en Python, mais moins performante et plus verbeuse :
    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
    import os
     
    def main():
        for file_path in get_direct_children_file_paths_with_extension(dir_path='.', extension='.txt'):
            print(file_path)
     
    def get_direct_children_file_paths_with_extension(dir_path, extension):
        result = []
        for path in get_direct_children_file_paths(dir_path):
            if path.endswith(extension):
                result.append(path)
        return result
     
    def get_direct_children_file_paths(dir_path):
        result = []
        for entry in os.scandir(dir_path):
            if entry.is_file():
                result.append(entry.path)
        return result
     
    if __name__ == '__main__':
        main()
    La fonction get_direct_children_file_paths est le genre de fonction réutilisable qui finit à terme par se retrouver dans un module utilitaire utilisé par plusieurs programmes.

    Sur le long terme, découper le code en petits morceaux réutilisables facilite la mise à jour du code.

    Une version monolithique du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import os
     
    if __name__ == '__main__':
        for entry in os.scandir('.'):
            if entry.is_file():
                file_path = entry.path
                if file_path.endswith('.txt'):
                    print(file_path)
    La version monolithique fonctionne. Mais, le jour où on veut réutiliser le code, ça finit en copié-collé. Et si un jour on veut modifier chacun des morceaux qui ont été copiés-collés, cela va prendre du temps.

  10. #10
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par Pyramidev Voir le message
    Pour parcourir les enfants directs d'un dossier, depuis Python 3.5, la fonction à choisir par défaut est os.scandir, introduite par la PEP 471.
    Effectivement, depuis Python 3.5, il vaut mieux utiliser os.scandir que os.listdir puisqu'il est beaucoup plus rapide. Avant la version 3.5, il existait le module externe "scandir" installable avec pip.

    Mais iglob, qui utilise os.scandir et fnmatch, est très simple à utiliser, et permet même de faire des recherches dans l'arborescence complète d'un répertoire (option "recursive=True"). J'en ai donné quelques exemples ici: https://www.developpez.net/forums/d1...ive-glob-glob/.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

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

Discussions similaires

  1. [Batch] Exécuter des commandes sur plusieurs serveurs en même temps
    Par Med_be dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 27/03/2015, 19h05
  2. Répéter une commande sur un ensemble de fichiers
    Par sohoney dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 11/01/2013, 10h55
  3. [Batch] Exécuter une commande sur un ensemble de fichiers
    Par flo44 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 23/04/2010, 16h07
  4. Réponses: 11
    Dernier message: 30/06/2008, 13h15

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