python ver manejo - ¿Cómo enumero todos los archivos de un directorio?





15 Answers

Prefiero usar el módulo glob , ya que hace la comparación de patrones y la 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', .... ]
directorios que es

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




Obtén una lista de archivos con Python 2 y 3

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

os.listdir ()

o ..... cómo obtener todos los archivos (y directorios) en el directorio actual (Python 3)

La forma más sencilla de tener el archivo en el directorio actual en Python 3 es esta. Es realmente simple; use el módulo os y la función listdir () y tendrá el archivo en ese directorio (y las eventuales carpetas que están en el directorio, pero no tendrá el archivo en el subdirectorio, para eso puede usar walk - lo haré hablar de ello más tarde).

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

Usando glob

Me pareció más fácil seleccionar el archivo 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 completo de la ruta con os.path.abspath

Como notó, no tiene la ruta completa del archivo en el código anterior. Si necesita tener la ruta absoluta, puede usar otra función del módulo os.path llamada _getfullpathname , poniendo el archivo que obtiene de os.listdir() como un argumento. Hay otras formas de tener la ruta completa, como veremos más adelante (reemplazé, como lo sugirió 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']

Obtenga el nombre completo de la ruta 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 del cual no recuerdo 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 (): obtiene archivos en el directorio actual (Python 2)

En Python 2, si desea la lista de los archivos en el directorio actual, debe presentar 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']

Subir en el árbol de directorios.

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

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

Obtenga 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', 'file')

>>> 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: \'): obtenga la ruta completa - comprenda la lista

>>> [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 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 () - obtiene solo archivos txt

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

glob - obtener 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 utilizar la lista de comprensión.

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

* También puedes usar solo pathlib.Path () en lugar de pathlib.Path (".")

Utilice el método glob en pathlib.Path ()

import pathlib

py = pathlib.Path().glob("*.py")
for file in py:
    print(file)

salida:

stack_overflow_list.py
stack_overflow_list_tkinter.py

Obtén todos y solo 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 archivos con next y camine en un directorio

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

Obtenga solo directorios con next y camine en un directorio

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

Consigue todos los nombres de subdirección 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 todos los directorios 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?

Un script para poner orden en su computadora, encontrando todos los archivos de un tipo (predeterminado: pptx) y copiándolos 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 desee 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)

Ejemplo: txt con todos los archivos de un disco duro.

"""We are going to save a txt file with all the files in your directory.
We will use the function walk()

"""

import os

# see all the methods of os
# print(*dir(os), sep=", ")
listafile = []
percorso = []
with open("lista_file.txt", "w", encoding='utf-8') as testo:
    for root, dirs, files in os.walk("D:\\"):
        for file in files:
            listafile.append(file)
            percorso.append(root + "\\" + file)
            testo.write(file + "\n")
listafile.sort()
print("N. of files", len(listafile))
with open("lista_file_ordinata.txt", "w", encoding="utf-8") as testo_ordinato:
    for file in listafile:
        testo_ordinato.write(file + "\n")

with open("percorso.txt", "w", encoding="utf-8") as file_percorso:
    for file in percorso:
        file_percorso.write(file + "\n")

os.system("lista_file.txt")
os.system("lista_file_ordinata.txt")
os.system("percorso.txt")

Todo el archivo de C: \\ en un archivo de texto

Esta es una versión más corta del código anterior. Cambie la carpeta donde comenzar a buscar los archivos si necesita comenzar desde otra posición. Este código genera un archivo de texto de 50 mb en mi computadora con algo menos de 500.000 líneas con archivos con la ruta completa.

import os

with open("file.txt", "w", encoding="utf-8") as filewrite:
    for r, d, f in os.walk("C:\\"):
        for file in f:
            filewrite.write(f"{r + file}\n")    

Una función para buscar un determinado tipo de archivo.

importación OS

def searchfiles(extension='.ttf'):
    "Create a txt file with all the file of a type"
    with open("file.txt", "w", encoding="utf-8") as filewrite:
        for r, d, f in os.walk("C:\\"):
            for file in f:
                if file.endswith(extension):
                    filewrite.write(f"{r + file}\n")

# looking for ttf file (fonts)
searchfiles('ttf')



Obtención de rutas de archivo completas 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 puedes 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 el contenido, o concentrarse solo en archivos con la extensión ".dat" como en el código a continuación:

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

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




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

Pero, como otras personas señalaron en los comentarios, glob() puede ser superado por direcciones de slash inconsistentes. Para ayudar con eso, le sugiero que use las funciones join() y expanduser() en el módulo os.path , y quizás la función getcwd() en el módulo os .

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 la que está codificada en la ruta.

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 se basa en el nombre de carpeta Users que se encuentra a menudo en Windows y no 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 te ayuden a ver el poder de algunas de las funciones que puedes encontrar en los módulos estándar de la biblioteca de Python.




Debe usar el módulo os para listar el contenido del directorio. os.listdir(".") devuelve todos los contenidos del directorio. Repasamos el resultado y lo agregamos a la lista.

import os

content_list = []

for content in os.listdir("."): # "." means current directory
    content_list.append(content)

print content_list



import os
lst=os.listdir(path)

os.listdir devuelve una lista que contiene los nombres de las entradas en el directorio dado por ruta.




Python 3.5 introdujo un nuevo método, más rápido para caminar a través del directorio - os.scandir().

Ejemplo:

for file in os.scandir('/usr/bin'):
    line = ''
    if file.is_file():
        line += 'f'
    elif file.is_dir():
        line += 'd'
    elif file.is_symlink():
        line += 'l'
    line += '\t'
    print("{}{}".format(line, file.name))



Listar todos los archivos en un directorio:

import os
from os import path

files = [x for x in os.listdir(directory_path) if path.isfile(directory_path+os.sep+x)]

Aquí, obtienes una lista de todos los archivos en un directorio.




# -** coding: utf-8 -*-
import os
import traceback

print '\n\n'

def start():
    address = "/home/ubuntu/Desktop"
    try:
        Folders = []
        Id = 1
        for item in os.listdir(address):
            endaddress = address + "/" + item
            Folders.append({'Id': Id, 'TopId': 0, 'Name': item, 'Address': endaddress })
            Id += 1         

            state = 0
            for item2 in os.listdir(endaddress):
                state = 1
            if state == 1: 
                Id = FolderToList(endaddress, Id, Id - 1, Folders)
        return Folders
    except:
        print "___________________________ ERROR ___________________________\n" + traceback.format_exc()

def FolderToList(address, Id, TopId, Folders):
    for item in os.listdir(address):
        endaddress = address + "/" + item
        Folders.append({'Id': Id, 'TopId': TopId, 'Name': item, 'Address': endaddress })
        Id += 1

        state = 0
        for item in os.listdir(endaddress):
            state = 1
        if state == 1: 
            Id = FolderToList(endaddress, Id, Id - 1, Folders)
    return Id

print start()



Utilizando generadores

import os
def get_files(search_path):
     for (dirpath, _, filenames) in os.walk(search_path):
         for filename in filenames:
             yield os.path.join(dirpath, filename)
list_files = get_files('.')
for filename in list_files:
    print(filename)



Utilice esta función si desea usar un tipo de archivo diferente u obtener el directorio completo:

import os

def createList(foldername, fulldir = True, suffix=".jpg"):
    file_list_tmp = os.listdir(foldername)
    #print len(file_list_tmp)
    file_list = []
    if fulldir:
        for item in file_list_tmp:
            if item.endswith(suffix):
                file_list.append(os.path.join(foldername, item))
    else:
        for item in file_list_tmp:
            if item.endswith(suffix):
                file_list.append(item)
    return file_list



Mediante el uso de la osbiblioteca.

import os
for root, dirs,files in os.walk("your dir path", topdown=True):
    for name in files:
        print(os.path.join(root, name))



Refiriéndose a la respuesta de @adamk, aquí está mi método de detección de sistema operativo en respuesta al comentario de inconsistencia de barra de @Anti Earth

import sys
import os
from pathlib import Path
from glob import glob
platformtype = sys.platform
if platformtype == 'win32':
    slash = "\\"
if platformtype == 'darwin':
    slash = "/"

# TODO: How can I list all files of a directory in Python and add them to a list?

# Step 1 - List all files of a directory

# Method 1: Find only pre-defined filetypes (.txt) and no subfiles, answer provided by @adamk
dir1 = "%sfoo%sbar%s*.txt" % (slash)
_files = glob(dir1)

# Method 2: Find all files and no subfiles
dir2 = "%sfoo%sbar%s" % (slash)
_files = (x for x in Path("dir2").iterdir() if x.is_file())

# Method 3: Find all files and all subfiles
dir3 = "%sfoo%sbar" % (slash)
_files = (x for x in Path('dir3').glob('**/*') if x.is_file())


# Step 2 - Add them to a list

files_list = []
for eachfiles in _files:
    files_basename = os.path.basename(eachfiles)
    files_list.append(files_basename)
print(files_list)
['file1.txt', 'file2.txt', .... ]

Supongo que desea solo los nombres de basenames en la lista.

Consulte esta post para predefinir múltiples formatos de archivo para el Método 1.




Versión realmente simple:

import os
[f for f in os.listdir(os.getcwd) if ...]



Parte dos 1

Soluciones (continuación)

Otros enfoques:

  1. Usa Python solo como una envoltura

    • Todo se hace utilizando otra tecnología.
    • Esa tecnología es invocada desde Python.
    • El sabor más famoso que conozco es lo que llamo el enfoque de administrador de sistemas :

      • Utilice Python (o cualquier lenguaje de programación) para ejecutar comandos de shell (y analizar sus salidas). En general, se debe evitar este enfoque, ya que si algún formato de salida de comandos difiere ligeramente entre las versiones / versiones de SO , el código de análisis ser adaptado también; por no hablar de lugares no EN )
      • Algunos consideran que esto es un buen truco
      • Lo considero más como una solución alternativa ( ganancia ), ya que la acción en sí misma se realiza desde shell ( cmd en este caso), y por lo tanto no tiene nada que ver con Python .
      • El filtrado ( grep/ findstr) o el formato de salida se puede hacer en ambos lados, pero no voy a insistir en ello. Además, he utilizado deliberadamente en os.systemlugar de subprocess.Popen.
      (py35x64_test) E:\Work\Dev\\q003207219>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" -c "import os;os.system(\"dir /b root_dir\")"
      dir0
      dir1
      dir2
      dir3
      file0
      file1
      

Fin de la segunda parte 1


1. Debido al hecho de que Home posterior (/ respuesta de interrogación) límite 's es 30000 caracteres ( [] SE.Meta: Conocer sus propios límites:? ¿Cuál es la longitud máxima de un título de la pregunta, después, la imagen y los enlaces utilizados ), La respuesta fue dividida en 2 partes. Asegúrese de leer [SO]: ¿Cómo enumero todos los archivos de un directorio? (Respuesta de @ CristiFati - "Parte Uno") antes.




Related