web-dev-qa-db-fra.com

Liste des répertoires en Python

Comment obtenir une liste de tous les fichiers (et répertoires) d'un répertoire donné en Python?

531
Matt

C'est une façon de parcourir chaque fichier et répertoire dans une arborescence de répertoires:

import os

for dirname, dirnames, filenames in os.walk('.'):
    # print path to all subdirectories first.
    for subdirname in dirnames:
        print(os.path.join(dirname, subdirname))

    # print path to all filenames.
    for filename in filenames:
        print(os.path.join(dirname, filename))

    # Advanced usage:
    # editing the 'dirnames' list will stop os.walk() from recursing into there.
    if '.git' in dirnames:
        # don't go into any .git directories.
        dirnames.remove('.git')
591
Jerub

Vous pouvez utiliser

os.listdir(path)

Pour référence et plus de fonctions os, regardez ici:

510
rslite

Voici une fonction d'aide que j'utilise assez souvent:

import os

def listdir_fullpath(d):
    return [os.path.join(d, f) for f in os.listdir(d)]
93
giltay
import os

for filename in os.listdir("C:\\temp"):
    print  filename
80
curtisk

Si vous avez besoin de compétences globbing, il existe également un module pour cela. Par exemple:

import glob
glob.glob('./[0-9].*')

retournera quelque chose comme:

['./1.gif', './2.txt']

Voir la documentation ici .

12
kenny

Essaye ça:

import os
for top, dirs, files in os.walk('./'):
    for nm in files:       
        print os.path.join(top, nm)
9
paxdiablo

Pour les fichiers du répertoire de travail en cours sans spécifier de chemin

Python 2.7:  

import os
os.listdir(os.getcwd())

Python 3.x:  

import os
os.listdir()

Merci à Stam Kaly pour son commentaire sur python 3.x

7
Dave Engineer

Une implémentation récursive

import os

def scan_dir(dir):
    for name in os.listdir(dir):
        path = os.path.join(dir, name)
        if os.path.isfile(path):
            print path
        else:
            scan_dir(path)

J'ai écrit une version longue, avec toutes les options dont j'avais besoin: http://sam.nipl.net/code/python/find.py

Je suppose que ça ira aussi ici:

#!/usr/bin/env python

import os
import sys

def ls(dir, hidden=False, relative=True):
    nodes = []
    for nm in os.listdir(dir):
        if not hidden and nm.startswith('.'):
            continue
        if not relative:
            nm = os.path.join(dir, nm)
        nodes.append(nm)
    nodes.sort()
    return nodes

def find(root, files=True, dirs=False, hidden=False, relative=True, topdown=True):
    root = os.path.join(root, '')  # add slash if not there
    for parent, ldirs, lfiles in os.walk(root, topdown=topdown):
        if relative:
            parent = parent[len(root):]
        if dirs and parent:
            yield os.path.join(parent, '')
        if not hidden:
            lfiles   = [nm for nm in lfiles if not nm.startswith('.')]
            ldirs[:] = [nm for nm in ldirs  if not nm.startswith('.')]  # in place
        if files:
            lfiles.sort()
            for nm in lfiles:
                nm = os.path.join(parent, nm)
                yield nm

def test(root):
    print "* directory listing, with hidden files:"
    print ls(root, hidden=True)
    print
    print "* recursive listing, with dirs, but no hidden files:"
    for f in find(root, dirs=True):
        print f
    print

if __== "__main__":
    test(*sys.argv[1:])
2
Sam Watkins

Pour Python 2

#!/bin/python2

import os

def scan_dir(path):
    print map(os.path.abspath, os.listdir(pwd))

Pour Python 3

Pour filtrer et mapper, vous devez les envelopper avec list ()

#!/bin/python3

import os

def scan_dir(path):
    print(list(map(os.path.abspath, os.listdir(pwd))))

Il est maintenant recommandé de remplacer votre utilisation de map et filter par des expressions de générateur ou des compréhensions de liste

#!/bin/python

import os

def scan_dir(path):
    print([os.path.abspath(f) for f in os.listdir(path)])
1
Alejandro Blasco

Une belle ligne pour ne lister que les fichiers de manière récursive. Je l'ai utilisé dans ma directive setup.py package_data:

import os

[os.path.join(x[0],y) for x in os.walk('<some_directory>') for y in x[2]]

Je sais que ce n'est pas la réponse à la question, mais peut être utile

1
fivetentaylor

Voici une version Pythonic d'une ligne:

import os
dir = 'given_directory_name'
filenames = [os.path.join(os.path.dirname(os.path.abspath(__file__)),dir,i) for i in os.listdir(dir)]

Ce code répertorie le chemin complet de tous les fichiers et répertoires du nom de répertoire donné. 

1
salehinejad
#import modules
import os

_CURRENT_DIR = '.'


def rec_tree_traverse(curr_dir, indent):
    "recurcive function to traverse the directory"
    #print "[traverse_tree]"

    try :
        dfList = [os.path.join(curr_dir, f_or_d) for f_or_d in os.listdir(curr_dir)]
    except:
        print "wrong path name/directory name"
        return

    for file_or_dir in dfList:

        if os.path.isdir(file_or_dir):
            #print "dir  : ",
            print indent, file_or_dir,"\\"
            rec_tree_traverse(file_or_dir, indent*2)

        if os.path.isfile(file_or_dir):
            #print "file : ",
            print indent, file_or_dir

    #end if for loop
#end of traverse_tree()

def main():

    base_dir = _CURRENT_DIR

    rec_tree_traverse(base_dir," ")

    raw_input("enter any key to exit....")
#end of main()


if __== '__main__':
    main()
0
Alok

Alors que os.listdir() permet de générer une liste de noms de fichiers et de répertoires, vous souhaitez souvent en faire plus une fois que vous avez ces noms - et en Python3, pathlib simplifie ces tâches. Jetons un coup d'oeil et voyons si vous l'aimez autant que moi.

Pour lister le contenu d'un répertoire, construisez un objet Path et récupérez l'itérateur:

In [16]: Path('/etc').iterdir()
Out[16]: <generator object Path.iterdir at 0x110853fc0>

Si nous voulons juste une liste de noms de choses:

In [17]: [x.name for x in Path('/etc').iterdir()]
Out[17]:
['emond.d',
 'ntp-restrict.conf',
 'periodic',

Si vous voulez juste les répertoires: 

In [18]: [x.name for x in Path('/etc').iterdir() if x.is_dir()]
Out[18]:
['emond.d',
 'periodic',
 'mach_init.d',

Si vous voulez les noms de tous les fichiers de conf dans cette arborescence:

In [20]: [x.name for x in Path('/etc').glob('**/*.conf')]
Out[20]:
['ntp-restrict.conf',
 'dnsextd.conf',
 'syslog.conf',

Si vous voulez une liste de fichiers de conf dans l’arbre> = 1K:

In [23]: [x.name for x in Path('/etc').glob('**/*.conf') if x.stat().st_size > 1024]
Out[23]:
['dnsextd.conf',
 'pf.conf',
 'autofs.conf',

Résoudre les chemins relatifs devient facile:

In [32]: Path('../Operational Metrics.md').resolve()
Out[32]: PosixPath('/Users/starver/code/xxxx/Operational Metrics.md')

Naviguer avec un chemin est assez clair (bien qu'inattendu):

In [10]: p = Path('.')

In [11]: core = p / 'web' / 'core'

In [13]: [x for x in core.iterdir() if x.is_file()]
Out[13]:
[PosixPath('web/core/metrics.py'),
 PosixPath('web/core/services.py'),
 PosixPath('web/core/querysets.py'),
0
Steve Tarver

Voici une autre option.

os.scandir(path='.')

Il retourne un itérateur d'objets os.DirEntry correspondant aux entrées (avec les informations d'attribut de fichier) dans le répertoire indiqué par chemin. 

Exemple:

with os.scandir(path) as it:
    for entry in it:
        if not entry.name.startswith('.'):
            print(entry.name)

L'utilisation de scandir () au lieu de listdir () peut augmenter considérablement les performances du code qui a également besoin d'informations de type ou d'attributs de fichier, car les objets os.DirEntry exposent ces informations si le système d'exploitation les fournit lors de l'analyse d'un répertoire. Toutes les méthodes os.DirEntry peuvent effectuer un appel système, mais is_dir () et is_file () ne requièrent généralement qu'un appel système pour les liens symboliques; os.DirEntry.stat () nécessite toujours un appel système sous Unix, mais un seul pour les liens symboliques sous Windows.

Docs Python

0
Khaino

Celui qui a fonctionné avec moi est en quelque sorte une version modifiée de la réponse de Saleh ci-dessus.

Le code est comme suit: 

"dir = 'nom_répertoire_donné' noms de fichier = [os.path.abspath (os.path.join (dir, i)) pour i dans os.listdir (dir)]"

0
HassanSh__3571619
import os, sys

#open files in directory

path = "My Documents"
dirs = os.listdir( path )

# print the files in given directory

for file in dirs:
   print (file)
0
Kevin

Le code ci-dessous listera les répertoires et les fichiers du répertoire.

def print_directory_contents(sPath):
        import os                                       
        for sChild in os.listdir(sPath):                
            sChildPath = os.path.join(sPath,sChild)
            if os.path.isdir(sChildPath):
                print_directory_contents(sChildPath)
            else:
                print(sChildPath)
0

Si je pensais que je mettrais ceci dedans. Une manière simple et sale de faire des recherches avec des caractères génériques.

import re
import os

[a for a in os.listdir(".") if re.search("^.*\.py$",a)]
0
bng44270

FYI Ajouter un filtre de fichier extension ou ext importation os

path = '.'
for dirname, dirnames, filenames in os.walk(path):
    # print path to all filenames with extension py.
    for filename in filenames:
        fname_path = os.path.join(dirname, filename)
        fext = os.path.splitext(fname_path)[1]
        if fext == '.py':
            print fname_path
        else:
            continue
0
moylop260

Je sais que c'est une vieille question. C’est une façon intéressante de me rendre si vous êtes sur une machine liunx. 

import subprocess
print(subprocess.check_output(["ls", "/"]).decode("utf8"))
0
Abin