Question Comment lister tous les fichiers d'un répertoire?


Comment puis-je lister tous les fichiers d'un répertoire en Python et les ajouter à un list?


2812
2017-07-08 19:31


origine


Réponses:


os.listdir() vous obtiendrez tout ce qui est dans un répertoire - fichiers et répertoires.

Si tu veux juste fichiers, vous pouvez soit filtrer cela en utilisant os.path:

from os import listdir
from os.path import isfile, join
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]

ou vous pourriez utiliser os.walk() ce qui donnera deux listes pour chaque répertoire visité - la division en fichiers et répertoires pour vous. Si vous voulez seulement le répertoire supérieur, vous pouvez juste casser la première fois qu'il cède

from os import walk

f = []
for (dirpath, dirnames, filenames) in walk(mypath):
    f.extend(filenames)
    break

Et enfin, comme le montre cet exemple, en ajoutant une liste à une autre, vous pouvez soit utiliser .extend() ou

>>> q = [1, 2, 3]
>>> w = [4, 5, 6]
>>> q = q + w
>>> q
[1, 2, 3, 4, 5, 6]

Personnellement, je préfère .extend()


2813
2017-07-08 21:01



Je préfère utiliser le glob module, comme il fait correspondre et l'expansion de modèle.

import glob
print(glob.glob("/home/adam/*.txt"))

Il retournera une liste avec les fichiers interrogés:

['/home/adam/file1.txt', '/home/adam/file2.txt', .... ]

1138
2017-07-09 18:13



import os
os.listdir("somedirectory")

retournera une liste de tous les fichiers et répertoires dans "somedirectory".


518
2017-07-08 19:35



Obtenez une liste de fichiers avec Python 2 et 3


J'ai également fait une courte vidéo ici:  Python: comment obtenir une liste de fichiers dans un répertoire


os.listdir ()

ou ..... chaud pour obtenir tous les fichiers (et répertoires) dans le répertoire courant (Python 3)

La façon la plus simple d'avoir le fichier dans le répertoire courant dans Python 3 est la suivante. C'est vraiment simple. Utilisez le os module et la fonction listdir () et vous aurez le fichier dans ce répertoire (et les dossiers éventuels qui sont dans le répertoire, mais vous ne aurez pas le fichier dans le sous-répertoire, pour cela vous pouvez utiliser marcher - je vais en parler plus tard).

>>> import os
>>> arr = os.listdir()
>>> arr
['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

Utilisation de glob

J'ai trouvé glob plus facile de sélectionner un fichier du même type ou avec quelque chose en commun. Regardez l'exemple suivant:

import glob

txtfiles = []
for file in glob.glob("*.txt"):
    txtfiles.append(file)

Utilisation de la compréhension de liste

import glob

mylist = [f for f in glob.glob("*.txt")]

Obtenir le nom complet du chemin avec os.path.abspath

Comme vous l'avez remarqué, vous n'avez pas le chemin complet du fichier dans le code ci-dessus. Si vous avez besoin du chemin absolu, vous pouvez utiliser une autre fonction du os.path module appelé _getfullpathname, en mettant le fichier que vous obtenez de os.listdir() comme argument. Il y a d'autres façons d'avoir le chemin complet, comme nous le verrons plus tard (j'ai remplacé, comme suggéré par mexmex, _getfullpathname avec abspath).

>>> import os
>>> files_path = [os.path.abspath(x) for x in os.listdir()]
>>> files_path
['F:\\documenti\applications.txt', 'F:\\documenti\collections.txt']

Obtenir le chemin d'accès complet d'un type de fichier dans tous les sous-répertoires avec marche

Je trouve cela très utile pour trouver des choses dans de nombreux répertoires, et cela m'a aidé à trouver un fichier dont je ne me souvenais pas du nom:

import os

# Getting the current work directory (cwd)
thisdir = os.getcwd()

# r=root, d=directories, f = files
for r, d, f in os.walk(thisdir):
    for file in f:
        if ".docx" in file:
            print(os.path.join(r, file))

os.listdir (): récupère les fichiers dans le répertoire courant (Python 2)

Dans Python 2 vous, si vous voulez la liste des fichiers dans le répertoire courant, vous devez donner l'argument '.' ou os.getcwd () dans la méthode os.listdir.

>>> import os
>>> arr = os.listdir('.')
>>> arr
['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

Monter dans l'arborescence

>>> # Method 1
>>> x = os.listdir('..')

# Method 2
>>> x= os.listdir('/')

Récupère les fichiers: os.listdir () dans un répertoire particulier (Python 2 et 3)

>>> import os
>>> arr = os.listdir('F:\\python')
>>> arr
['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

Obtenir les fichiers d'un sous-répertoire particulier avec os.listdir ()

import os

x = os.listdir("./content")

os.walk ('.') - répertoire actuel

>>> import os
>>> arr = next(os.walk('.'))[2]
>>> arr
['5bs_Turismo1.pdf', '5bs_Turismo1.pptx', 'esperienza.txt']

module glob - tous les fichiers

import glob
print(glob.glob("*"))

out:['content', 'start.py']

next (os.walk ('.')) et os.path.join ('dir', 'fichier')

>>> import os
>>> arr = []
>>> for d,r,f in next(os.walk("F:\_python)):
>>>     for file in f:
>>>         arr.append(os.path.join(r,file))
...
>>> for f in arr:
>>>     print(files)

>output

F:\\_python\\dict_class.py
F:\\_python\\programmi.txt

next (os.walk ('F: \') - obtient le chemin complet - compréhension de la liste

>>> [os.path.join(r,file) for r,d,f in next(os.walk("F:\\_python")) for file in f]
['F:\\_python\\dict_class.py', 'F:\\_python\\programmi.txt']

os.walk - obtient le chemin complet - tous les fichiers dans les sous-répertoires

x = [os.path.join(r,file) for r,d,f in os.walk("F:\\_python") for file in f]

>>>x
['F:\\_python\\dict.py', 'F:\\_python\\progr.txt', 'F:\\_python\\readl.py']

os.listdir () - obtient seulement les fichiers txt

>>> arr_txt = [x for x in os.listdir() if x.endswith(".txt")]
>>> print(arr_txt)
['work.txt', '3ebooks.txt']

glob - obtient seulement les fichiers txt

>>> import glob
>>> x = glob.glob("*.txt")
>>> x
['ale.txt', 'alunni2015.txt', 'assenze.text.txt', 'text2.txt', 'untitled.txt']

Utilisation de glob pour obtenir le chemin complet des fichiers

Si je devais avoir besoin du chemin absolu des fichiers:

>>> from path import path
>>> from glob import glob
>>> x = [path(f).abspath() for f in glob("F:\*.txt")]
>>> for f in x:
...  print(f)
...
F:\acquistionline.txt
F:\acquisti_2018.txt
F:\bootstrap_jquery_ecc.txt

Autre utilisation de glob

Si je veux tous les fichiers du répertoire:

>>> x = glob.glob("*")

Utiliser os.path.isfile pour éviter les répertoires dans la liste

import os.path
listOfFiles = [f for f in os.listdir() if os.path.isfile(f)]
print(listOfFiles)

> output

['a simple game.py', 'data.txt', 'decorator.py']

Utilisation de pathlib depuis (Python 3.4)

import pathlib

>>> flist = []
>>> for p in pathlib.Path('.').iterdir():
...  if p.is_file():
...   print(p)
...   flist.append(p)
...
error.PNG
exemaker.bat
guiprova.mp3
setup.py
speak_gui2.py
thumb.PNG

Si vous voulez utiliser la compréhension de liste

>>> flist = [p for p in pathlib.Path('.').iterdir() if p.is_file()]

Obtenir tous les fichiers et uniquement avec os.walk

import os
x = [i[2] for i in os.walk('.')]
y=[]
for t in x:
    for f in t:
        y.append(f)

>>> y
['append_to_list.py', 'data.txt', 'data1.txt', 'data2.txt', 'data_180617', 'os_walk.py', 'READ2.py', 'read_data.py', 'somma_defaltdic.py', 'substitute_words.py', 'sum_data.py', 'data.txt', 'data1.txt', 'data_180617']

Obtenir seulement les fichiers avec next et marcher dans un répertoire

>>> import os
>>> x = next(os.walk('F://python'))[2]
>>> x
['calculator.bat','calculator.py']

Obtenir seulement les répertoires avec next et marcher dans un répertoire

>>> import os
>>> next(os.walk('F://python'))[1] # for the current dir use ('.')
['python3','others']

Obtenez tous les noms de sous-répertoires avec la marche

>>> for r,d,f in os.walk("F:\_python"):
...  for dirs in d:
...   print(dirs)
...
.vscode
pyexcel
pyschool.py
subtitles
_metaprogramming
.ipynb_checkpoints

os.scandir () de Python 3.5 sur

>>> import os
>>> x = [f.name for f in os.scandir() if f.is_file()]
>>> x
['calculator.bat','calculator.py']

# Another example with scandir (a little variation from docs.python.org)
# This one is more efficient than os.listdir.
# In this case, it shows the files only in the current directory
# where the script is executed.

>>> import os
>>> with os.scandir() as i:
...  for entry in i:
...   if entry.is_file():
...    print(entry.name)
...
ebookmaker.py
error.PNG
exemaker.bat
guiprova.mp3
setup.py
speakgui4.py
speak_gui2.py
speak_gui3.py
thumb.PNG
>>>

Ex. 1: Combien y a-t-il de fichiers dans les sous-répertoires?

Dans cet exemple, nous recherchons le nombre de fichiers inclus dans tout le répertoire et ses sous-répertoires.

import os

def count(dir, counter=0):
    "returns number of files in dir and subdirs"
    for pack in os.walk(dir):
        for f in pack[2]:
            counter += 1
    return dir + " : " + str(counter) + "files"

print(count("F:\\python"))

> output

>'F:\\\python' : 12057 files'

Ex.2: Comment copier tous les fichiers d'un répertoire à un autre?

Un script pour mettre de l'ordre dans votre ordinateur en trouvant tous les fichiers d'un type (par défaut: pptx) et en les copiant dans un nouveau dossier.

import os
import shutil
from path import path

destination = "F:\\file_copied"
# os.makedirs(destination)

def copyfile(dir, filetype='pptx', counter=0):
    "Searches for pptx (or other - pptx is the default) files and copies them"
    for pack in os.walk(dir):
        for f in pack[2]:
            if f.endswith(filetype):
                fullpath = pack[0] + "\\" + f
                print(fullpath)
                shutil.copy(fullpath, destination)
                counter += 1
    if counter > 0:
        print("------------------------")
        print("\t==> Found in: `" + dir + "` : " + str(counter) + " files\n")

for dir in os.listdir():
    "searches for folders that starts with `_`"
    if dir[0] == '_':
        # copyfile(dir, filetype='pdf')
        copyfile(dir, filetype='txt')


> Output

_compiti18\Compito Contabilità 1\conti.txt
_compiti18\Compito Contabilità 1\modula4.txt
_compiti18\Compito Contabilità 1\moduloa4.txt
------------------------
==> Found in: `_compiti18` : 3 files

Ex. 3: Comment obtenir tous les fichiers dans un fichier txt

Dans le cas où vous voulez créer un fichier txt avec tous les noms de fichiers:

import os
mylist = ""
with open("filelist.txt", "w", encoding="utf-8") as file:
    for eachfile in os.listdir():
        mylist += eachfile + "\n"
    file.write(mylist)

327
2018-01-03 15:36



Une solution d'une ligne pour obtenir seule liste de fichiers (pas de sous-répertoires):

filenames = next(os.walk(path))[2]

ou chemins absolus:

paths = [os.path.join(path,fn) for fn in next(os.walk(path))[2]]

144
2018-01-18 17:42



Obtention de chemins de fichier complets à partir d'un répertoire et de tous ses sous-répertoires

import os

def get_filepaths(directory):
    """
    This function will generate the file names in a directory 
    tree by walking the tree either top-down or bottom-up. For each 
    directory in the tree rooted at directory top (including top itself), 
    it yields a 3-tuple (dirpath, dirnames, filenames).
    """
    file_paths = []  # List which will store all of the full filepaths.

    # Walk the tree.
    for root, directories, files in os.walk(directory):
        for filename in files:
            # Join the two strings in order to form the full filepath.
            filepath = os.path.join(root, filename)
            file_paths.append(filepath)  # Add it to the list.

    return file_paths  # Self-explanatory.

# Run the above function and store its results in a variable.   
full_file_paths = get_filepaths("/Users/johnny/Desktop/TEST")

  • Le chemin que j'ai fourni dans la fonction ci-dessus contenait 3 fichiers - deux d'entre eux dans le répertoire racine, et un autre dans un sous-dossier appelé "SUBFOLDER". Vous pouvez maintenant faire des choses comme:
  • print full_file_paths qui va imprimer la liste:

    • ['/Users/johnny/Desktop/TEST/file1.txt', '/Users/johnny/Desktop/TEST/file2.txt', '/Users/johnny/Desktop/TEST/SUBFOLDER/file3.dat']

Si vous le souhaitez, vous pouvez ouvrir et lire le contenu, ou se concentrer uniquement sur les fichiers avec l'extension ".dat" comme dans le code ci-dessous:

for f in full_file_paths:
  if f.endswith(".dat"):
    print f

/Users/johnny/Desktop/TEST/SUBFOLDER/file3.dat


110
2017-10-11 00:55



Depuis la version 3.4, il existe des itérateurs pour cela, qui sont beaucoup plus efficaces que os.listdir():

pathlib: Nouveau dans la version 3.4.

>>> import pathlib
>>> [p for p in pathlib.Path('.').iterdir() if p.is_file()]

Selon PEP 428, le but de pathlib La bibliothèque doit fournir une hiérarchie simple de classes pour gérer les chemins du système de fichiers et les opérations communes que les utilisateurs effectuent par dessus.

os.scandir(): Nouveau dans la version 3.5.

>>> import os
>>> [entry for entry in os.scandir('.') if entry.is_file()]

Notez que os.walk() les usages os.scandir() au lieu de os.listdir() à partir de la version 3.5, et sa vitesse a été augmentée de 2 à 20 fois selon PEP 471.

Permettez-moi également de vous recommander de lire le commentaire de ShadowRanger ci-dessous.


57
2018-06-18 20:58



j'ai vraiment aimé La réponse d'adamk, suggérant que vous utilisez glob(), à partir du module du même nom. Cela vous permet d'avoir un motif correspondant à *s.

Mais comme d'autres personnes l'ont souligné dans les commentaires, glob() peut se faire trébucher sur des directions de barre oblique incohérentes. Pour aider avec cela, je vous suggère d'utiliser le join() et expanduser() fonctions dans le os.path module, et peut-être le getcwd() fonctionner dans le os module, aussi bien.

Comme exemples:

from glob import glob

# Return everything under C:\Users\admin that contains a folder called wlp.
glob('C:\Users\admin\*\wlp')

Ce qui précède est terrible - le chemin a été codé en dur et ne fonctionnera que sur Windows entre le nom du lecteur et le \s étant codé en dur dans le chemin.

from glob    import glob
from os.path import join

# Return everything under Users, admin, that contains a folder called wlp.
glob(join('Users', 'admin', '*', 'wlp'))

Ce qui précède fonctionne mieux, mais il repose sur le nom du dossier Usersqui est souvent trouvé sur Windows et pas si souvent sur les autres systèmes d'exploitation. Il repose également sur l'utilisateur ayant un nom spécifique, admin.

from glob    import glob
from os.path import expanduser, join

# Return everything under the user directory that contains a folder called wlp.
glob(join(expanduser('~'), '*', 'wlp'))

Cela fonctionne parfaitement sur toutes les plates-formes.

Un autre excellent exemple qui fonctionne parfaitement à travers les plates-formes et fait quelque chose d'un peu différent:

from glob    import glob
from os      import getcwd
from os.path import join

# Return everything under the current directory that contains a folder called wlp.
glob(join(getcwd(), '*', 'wlp'))

J'espère que ces exemples vous aideront à voir la puissance de quelques-unes des fonctions que vous pouvez trouver dans les modules de la bibliothèque Python standard.


45
2017-07-09 11:43



def list_files(path):
    # returns a list of names (with extension, without full path) of all files 
    # in folder path
    files = []
    for name in os.listdir(path):
        if os.path.isfile(os.path.join(path, name)):
            files.append(name)
    return files 

33
2018-06-10 16:16