Comment obtenir une liste de tous les fichiers (et répertoires) d'un répertoire donné en Python?
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')
Vous pouvez utiliser
os.listdir(path)
Pour référence et plus de fonctions os, regardez ici:
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)]
import os
for filename in os.listdir("C:\\temp"):
print filename
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 .
Essaye ça:
import os
for top, dirs, files in os.walk('./'):
for nm in files:
print os.path.join(top, nm)
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
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:])
#!/bin/python2
import os
def scan_dir(path):
print map(os.path.abspath, os.listdir(pwd))
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)])
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
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é.
#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()
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'),
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.
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)]"
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)
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)
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)]
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
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"))