Pregunta ¿Cómo hago una lista de todos los archivos de un directorio?


¿Cómo puedo enumerar todos los archivos de un directorio en Python y agregarlos a un list?


2812
2017-07-08 19:31


origen


Respuestas:


os.listdir() obtendrá todo lo que está en un directorio: archivos y directorios.

Si tu quieres sólo archivos, puede filtrar esto usando os.path:

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

o podrías usar os.walk() que producirá dos listas para cada directorio que visita, dividiéndose en archivos y directorios para usted. Si solo quieres el directorio principal, puedes romper la primera vez que cede

from os import walk

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

Y, por último, como muestra ese ejemplo, al agregar una lista a otra puedes usar .extend() o

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

Personalmente, prefiero .extend()


2813
2017-07-08 21:01



Prefiero usar el glob módulo, ya que hace coincidencia de patrones y expansión.

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

Devolverá una lista con los archivos consultados:

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

1138
2017-07-09 18:13



import os
os.listdir("somedirectory")

devolverá una lista de todos los archivos y directorios en "somedirectorio".


518
2017-07-08 19:35



Obtenga una lista de archivos con Python 2 y 3


También hice un video corto aquí:  Python: cómo obtener una lista de archivos en un directorio


os.listdir ()

o ..... caliente para obtener todos los archivos (y directorios) en el directorio actual (Python 3)

La forma más simple de tener el archivo en el directorio actual en Python 3 es esto. Es realmente simple; utilizar el os módulo y la función listdir () y tendrá el archivo en ese directorio (y eventuales carpetas que están en el directorio, pero no tendrá el archivo en el subdirectorio, para eso puede usar walk - Hablaré de eso luego).

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

Usando glob

Encontré glob más fácil seleccionar archivos del mismo tipo o con algo en común. Mira el siguiente ejemplo:

import glob

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

Usando la lista de comprensión

import glob

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

Obtener el nombre de ruta completo con os.path.abspath

Como habrás notado, no tienes la ruta completa del archivo en el código anterior. Si necesita tener la ruta absoluta, puede usar otra función del os.path módulo llamado _getfullpathname, poniendo el archivo que obtienes de os.listdir() como un argumento Hay otras maneras de tener la ruta completa, como comprobaremos más adelante (reemplacé, como lo sugiere mexmex, _getfullpathname con abspath)

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

Obtener el nombre de ruta completo de un tipo de archivo en todos los subdirectorios con walk

Encuentro esto muy útil para encontrar cosas en muchos directorios, y me ayudó a encontrar un archivo sobre el cual no recordaba el nombre:

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 (): obtener archivos en el directorio actual (Python 2)

En Python 2 usted, si desea la lista de los archivos en el directorio actual, debe dar el argumento como '.' o os.getcwd () en el método os.listdir.

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

Para ir en el árbol de directorios

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

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

Obtener archivos: os.listdir () en un directorio particular (Python 2 y 3)

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

Obtener archivos de un subdirectorio particular con os.listdir ()

import os

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

os.walk ('.') - directorio actual

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

módulo glob - todos los archivos

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

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

next (os.walk ('.')) y os.path.join ('dir', 'archivo')

>>> 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

siguiente (os.walk ('F: \') - obtener la ruta completa - lista de comprensión

>>> [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 - obtener la ruta completa - todos los archivos en subdirectorios

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 (): obtén solo archivos txt

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

glob: obtén solo archivos txt

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

Usando glob para obtener la ruta completa de los archivos

Si necesito la ruta absoluta de los archivos:

>>> 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

Otro uso de glob

Si quiero todos los archivos en el directorio:

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

Usando os.path.isfile para evitar directorios en la lista

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']

Usando pathlib desde (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 quieres usar la lista de comprensión

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

Obtenga todos los archivos con 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']

Obtenga solo los archivos con el siguiente y camine en un directorio

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

Obtenga solo directorios con el siguiente y camine en un directorio

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

Obtener todos los nombres de subdir con walk

>>> 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 en

>>> 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: ¿Cuántos archivos hay en los subdirectorios?

En este ejemplo, buscamos la cantidad de archivos que se incluyen en todo el directorio y sus subdirectorios.

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'

Ej.2: ¿Cómo copiar todos los archivos de un directorio a otro?

Una secuencia de comandos para hacer un pedido en su computadora que busca todos los archivos de un tipo (predeterminado: pptx) y copiarlos en una nueva carpeta.

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: Cómo obtener todos los archivos en un archivo txt

En caso de que quiera crear un archivo txt con todos los nombres de archivo:

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



Una solución de una línea para obtener solo lista de archivos (sin subdirectorios):

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

o nombres de ruta absolutos:

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

144
2018-01-18 17:42



Obtener rutas completas de archivos desde un directorio y todos sus subdirectorios

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")

  • La ruta que proporcioné en la función anterior contenía 3 archivos, dos de ellos en el directorio raíz y otro en una subcarpeta llamada "SUBFOLDER". Ahora puede hacer cosas como:
  • print full_file_paths que imprimirá la lista:

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

Si lo desea, puede abrir y leer los contenidos, o centrarse solo en los archivos con la extensión ".dat" como en el siguiente código:

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



Desde la versión 3.4 hay incorporados iteradores para esto, que son mucho más eficientes que os.listdir():

pathlib: Nuevo en la versión 3.4.

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

De acuerdo a PEP 428, el objetivo de pathlib La biblioteca debe proporcionar una jerarquía simple de clases para gestionar las rutas del sistema de archivos y las operaciones comunes que los usuarios realizan sobre ellas.

os.scandir(): Nuevo en la versión 3.5.

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

Tenga en cuenta que os.walk() usos os.scandir() en lugar de os.listdir() desde la versión 3.5, y su velocidad aumentó de 2 a 20 veces según PEP 471.

Permítanme también recomendar leer el comentario de ShadowRanger a continuación.


57
2018-06-18 20:58



realmente me gustó la respuesta de adamk, sugiriendo que uses glob(), del módulo del mismo nombre. Esto le permite emparejar patrones con *s.

Pero como otras personas señalaron en los comentarios, glob() puede tropezar con direcciones de barra incongruentes. Para ayudar con eso, te sugiero que uses el join() y expanduser() funciones en el os.path módulo, y tal vez el getcwd() función en el os módulo, también.

Como ejemplos:

from glob import glob

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

Lo anterior es terrible: la ruta ha sido codificada y solo funcionará en Windows entre el nombre de la unidad y el \s está codificado en el camino.

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'))

Lo anterior funciona mejor, pero depende del nombre de la carpeta Usersque a menudo se encuentra en Windows y no se encuentra tan a menudo en otros sistemas operativos. También se basa en que el usuario tenga un nombre específico, 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'))

Esto funciona perfectamente en todas las plataformas.

Otro gran ejemplo que funciona perfectamente en todas las plataformas y hace algo un poco diferente:

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'))

Espero que estos ejemplos lo ayuden a ver el poder de algunas de las funciones que puede encontrar en los módulos de biblioteca estándar de Python.


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