Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Recherche de fichier dans une arborescence et lui attribuer un nom de variable en Python ?

+2 votes

en bash je fais :

fic=$(find $HOME -name "mon_fichier" -type f)

echo $fic et il me sort le chemin absolu du fichier, ce dont j'ai exactement besoin, pas dans une liste comme avec glob.glob()

Je n'arrive pas à reproduire le même résultat en Python

demandé 6-Nov-2016 par anonyme
edité 6-Nov-2016 par foxmask

3 Réponses

+2 votes

Un truc dans ce genre

répondu 6-Nov-2016 par foxmask (2,644 points)
+3 votes

En passant par le tout nouveau scandir, il est possible de chercher récursivement les fichiers.

import os

for entry in os.scandir('.'):
    if entry.is_file() and entry.name == 'mon_fichier':  # ou tout autre travail, avec des regex par exemple
        print(os.path.join(entry.path, entry.name))

Si Python 3.5 n'est pas accessible, scandir est disponible via pip. (projet github), et sinon, walkdir, présenté dans les autres réponses, permet également de faire ce job.

répondu 6-Nov-2016 par lucas (2,044 points)
edité 10-Nov-2016 par lucas
+2 votes

Avec path.py (accessible via un pip install path), largement décrit dans un article de S&M, tu peux faire

from path import Path
print(next(Path('.').walkfiles('my_file')).abspath())

La méthode walkfiles retourne un générateur renvoyant tous les fichier contenu dans le dossier et dans les sous dossiers suivant le pattern donné.
J'ai supposé que tu n'en avais qu'un, je me suis donc contenté de printer la première itération du générateur.

Si tu en as plusieurs et que tu veux tous les afficher, tu peux tout simplement faire

from path import Path    
for file in Path('../').walkfiles('full_data.npy')):
        print(file.abspath())

path.py est une dépendance qui n'est pas bien grosse (1 fichier seulement).

EDIT:

J'ai vu que depuis la 3.4 la stdlib contient une lib qui semble très similaire:
https://docs.python.org/3.6/library/pathlib.html

from pathlib import Path
print(next(Path('.').glob('**/my_file')))

devrait donner le même résultat, sans dépendance.

répondu 10-Nov-2016 par Poisson (260 points)
edité 16-Nov-2016 par Poisson
...