Obter uma lista de nomes de ficheiros e directórios em Python.

O negócio

Para obter uma lista de nomes de ficheiros e directórios (nomes de pastas) em Python, utilize a função os.listdir() do módulo.

os.listdir(path='.')
Retorna uma lista contendo os nomes de entrada no directório especificado por caminho.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

O módulo os está incluído na biblioteca padrão e não necessita de ser instalado. No entanto, é necessária a “importação”.

A seguinte informação é fornecida aqui.

  • Obtenha uma lista tanto de nomes de ficheiros como de directórios.
  • Obter uma lista apenas de nomes de ficheiros
  • Obter uma lista apenas de nomes de directórios

O seguinte é um exemplo de uma estrutura de ficheiro (directório).

.
└── testdir
    ├── dir1
    ├── dir2
    ├── file1
    ├── file2.txt
    └── file3.jpg

Além de os.listdir(), também pode usar o módulo glob para obter uma lista de nomes de ficheiros e directórios (nomes de pastas). glob permite-lhe especificar condições usando wildcards (*), etc., e incluir recursivamente subdirectórios.

Em Python 3.4 e posteriores, é também possível obter uma lista de ficheiros e directórios utilizando o módulo pathlib, que pode manipular caminhos como objectos. Tal como os globos acima, também pode ser utilizado condicionalmente e de forma recorrente.

Obtenha uma lista tanto de nomes de ficheiros como de directórios.

Se utilizar os.listdir() como está, devolverá uma lista tanto de nomes de ficheiros como de directórios.

import os

path = "./testdir"

files = os.listdir(path)
print(type(files))  # <class 'list'>
print(files)        # ['dir1', 'dir2', 'file1', 'file2.txt', 'file3.jpg']

O que se obtém é uma lista de cordas de caminho.

Obter uma lista apenas de nomes de ficheiros

Se quiser obter uma lista de apenas nomes de ficheiros, use a função os.path.isfile() para determinar se o caminho é um ficheiro. passar apenas o nome do ficheiro como argumento da função os.path.isfile() não funcionará, por isso passe o caminho completo como se mostra abaixo.
os.path.isfile(os.path.join(path, f))

files = os.listdir(path)
files_file = [f for f in files if os.path.isfile(os.path.join(path, f))]
print(files_file)   # ['file1', 'file2.txt', 'file3.jpg']

Obter uma lista apenas de nomes de directórios

Se quiser obter uma lista apenas de nomes de directórios, utilize os.path.isdir() da mesma forma.

files = os.listdir(path)
files_dir = [f for f in files if os.path.isdir(os.path.join(path, f))]
print(files_dir)    # ['dir1', 'dir2']