python subpastas - Como faço para listar todos os arquivos de um diretório?




txt importar (25)

Uma solução de uma linha para obter apenas uma lista de arquivos (sem subdiretórios):

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

ou caminhos absolutos:

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

Como posso listar todos os arquivos de um diretório em Python e adicioná-los a uma list ?


Aqui está a minha função de propósito geral para isso. Ele retorna uma lista de caminhos de arquivos em vez de nomes de arquivos, pois descobri que isso é mais útil. Tem alguns argumentos opcionais que o tornam versátil. Por exemplo, eu costumo usá-lo com argumentos como pattern='*.txt'ou subfolders=True.

(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

import os
import os.path


def get_files(target_dir):
    item_list = os.listdir(target_dir)

    file_list = list()
    for item in item_list:
        item_dir = os.path.join(target_dir,item)
        if os.path.isdir(item_dir):
            file_list += get_files(item_dir)
        else:
            file_list.append(item_dir)
    return file_list

Aqui eu uso uma estrutura recursiva.


import os
os.listdir("somedirectory")

retornará uma lista de todos os arquivos e diretórios em "algum diretório".


# -** 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()

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)

Eu prefiro usar o módulo glob , pois ele faz correspondência e expansão de padrões.

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

Ele retornará uma lista com os arquivos consultados:

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

Listar todos os arquivos em um diretório:

import os
from os import path

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

Aqui, você obtém uma lista de todos os arquivos em um diretório.


Referindo-se à resposta de @adamk, aqui está o meu método de detecção do sistema operacional em resposta ao comentário de inconsistência de barra por @Anti Earth

from pathlib import Path
folder = '/foo'
[f for f in Path(folder).glob('*') if f.is_file()]
[f for f in Path(folder).glob('**/*.py') if not f.is_symlink()]

Estou supondo que você queira apenas os nomes basenames na lista.

Consulte este post para predefinir vários formatos de arquivo para o Método 1.


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

Isso retornará uma lista de todos os arquivos e diretórios no path.

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

Isso retornará apenas uma lista de arquivos, não subdiretórios.


Se você está procurando por uma implementação Python de find , esta é uma receita que eu uso com bastante frequência:

from findtools.find_files import (find_files, Match)

# Recursively find all *.sh files in **/usr/bin**
sh_files_pattern = Match(filetype='f', name='*.sh')
found_files = find_files(path='/usr/bin', match=sh_files_pattern)

for found_file in found_files:
    print found_file

Então criei um package PyPI e também há um repositório GitHub . Espero que alguém considere potencialmente útil para este código.


Fornecerei um exemplo de um liner em que sourcepath e tipo de arquivo podem ser fornecidos como entrada. O código retorna uma lista de nomes de arquivos com a extensão csv. Use . no caso de todos os arquivos precisarem ser devolvidos. Isso também examinará recursivamente os subdiretórios.

[y for x in os.walk(sourcePath) for y in glob(os.path.join(x[0], '*.csv'))]

Modifique as extensões de arquivo e o caminho de origem conforme necessário.


Use esta função se você quiser usar um tipo de arquivo diferente ou obter o diretório completo:

import os 
os.listdir(path)

Você deve usar o módulo os para listar o conteúdo do diretório. os.listdir(".") retorna todo o conteúdo do diretório. Nós iteramos sobre o resultado e acrescentamos à lista.

import os

content_list = []

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

print content_list

Desde a versão 3.4 existem iteradores embutidos para isso que são muito mais eficientes que os.listdir() :

pathlib : Novo na versão 3.4.

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

De acordo com o PEP 428 , o objetivo da biblioteca pathlib é fornecer uma hierarquia simples de classes para manipular os caminhos do sistema de arquivos e as operações comuns que os usuários fazem sobre eles.

os.scandir() : Novo na versão 3.5.

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

Note que os.walk() usa os.scandir() invés de os.listdir() da versão 3.5, e sua velocidade foi aumentada em 2-20 vezes de acordo com o PEP 471 .

Deixe-me também recomendar a leitura do comentário do ShadowRanger abaixo.


Se você se preocupa com o desempenho, tente scandir. Para o Python 2.x, talvez seja necessário instalá-lo manualmente. Exemplos:

def scan_path(path):
    de = scandir.scandir(path)
    while 1:
        try:
            e = de.next()
            if e.is_dir():
                scan_path(e.path)
            else:
                print e.path
        except StopIteration as _:
                break

Isso economiza muito tempo quando você precisa digitalizar um diretório enorme, e você não precisa armazenar em buffer uma lista enorme, basta buscar um por um. E também você pode fazer isso de forma recursiva:

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

Obter uma lista de arquivos com o Python 2 e 3

Eu também fiz um pequeno vídeo aqui: Python: como obter uma lista de arquivos em um diretório

os.listdir ()

ou ..... como obter todos os arquivos (e diretórios) no diretório atual (Python 3)

A maneira mais simples de ter o arquivo no diretório atual no Python 3 é essa. É muito simples; use o módulo os e a função listdir () e você terá o arquivo nesse diretório (e eventuais pastas que estão no diretório, mas você não terá o arquivo no subdiretório, para que você possa usar o walk - eu irei fale sobre isso depois).

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

Usando glob

Achei glob mais fácil selecionar arquivo do mesmo tipo ou com algo em comum. Veja o seguinte exemplo:

import glob

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

Usando a compreensão da lista

import glob

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

Obtendo o nome do caminho completo com os.path.abspath

Como você percebeu, você não tem o caminho completo do arquivo no código acima. Se você precisa ter o caminho absoluto, você pode usar outra função do módulo _getfullpathname chamada _getfullpathname , colocando o arquivo que você obtém de os.listdir() como um argumento. Existem outras maneiras de ter o caminho completo, como veremos mais tarde (eu substituí, como sugerido por mexmex, _getfullpathname com abspath ).

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

Obter o nome do caminho completo de um tipo de arquivo em todos os subdiretórios com caminhada

Acho isso muito útil para encontrar coisas em muitos diretórios, e isso me ajudou a encontrar um arquivo sobre o qual eu não lembrava o nome:

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 (): obtém arquivos no diretório atual (Python 2)

No Python 2 você, se você quiser a lista dos arquivos no diretório atual, você tem que dar o argumento como '.' ou os.getcwd () no método os.listdir.

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

Para subir na árvore de diretórios

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

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

Obter arquivos: os.listdir () em um diretório específico (Python 2 e 3)

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

Obter arquivos de um subdiretório específico com os.listdir ()

import os

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

os.walk ('.') - diretório atual

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

módulo glob - todos os arquivos

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

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

next (os.walk ('.')) e 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: \') - obtém o caminho completo - compreensão da 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 - get full path - todos os arquivos em sub dirs

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ém apenas arquivos txt

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

glob - obtém apenas arquivos txt

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

Usando glob para obter o caminho completo dos arquivos

Se eu precisar do caminho absoluto dos arquivos:

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

Outro uso do glob

Se eu quiser todos os arquivos no diretório:

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

Usando os.path.isfile para evitar diretórios na 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 o pathlib do (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

Se você quiser usar a compreensão da lista

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

* Você também pode usar apenas pathlib.Path () em vez de pathlib.Path (".")

Use o método glob em pathlib.Path ()

import pathlib

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

saída:

stack_overflow_list.py
stack_overflow_list_tkinter.py

Obter todos e apenas arquivos com 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']

Obter apenas arquivos com o próximo e andar em um diretório

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

Obtenha apenas diretórios com next e ande em um diretório

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

Obter todos os nomes dos subdiretórios a pé

>>> 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 () do Python 3.5 em

>>> 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: Quantos arquivos existem nos subdiretórios?

Neste exemplo, procuramos o número de arquivos incluídos em todo o diretório e em seus subdiretórios.

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: Como copiar todos os arquivos de um diretório para outro?

Um script para fazer com que o seu computador encontre todos os arquivos de um tipo (padrão: pptx) e copie-os em uma nova pasta.

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: Como obter todos os arquivos em um arquivo txt

Caso você queira criar um arquivo txt com todos os nomes de arquivos:

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

Exemplo: txt com todos os arquivos de um disco rígido

"""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 o arquivo de C: \\ em um arquivo de texto

Esta é uma versão mais curta do código anterior. Altere a pasta onde começar a encontrar os arquivos, se você precisar começar de outra posição. Este código gera 50 mb em um arquivo de texto no meu computador com menos de 500.000 linhas com arquivos com o caminho completo.

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

Uma função para procurar um determinado tipo de arquivo

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

Execute findfiles () com um diretório como parâmetro e ele retornará uma lista de todos os arquivos contidos nele.

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)

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 

Obtendo caminhos de arquivos completos de um diretório e todos os seus subdiretórios

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")
  • O caminho que eu forneci na função acima continha 3 arquivos - dois deles no diretório raiz e outro em uma subpasta chamada "SUBFOLDER". Agora você pode fazer coisas como:
  • print full_file_paths que irá imprimir a lista:

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

Se desejar, você pode abrir e ler o conteúdo ou focar apenas em arquivos com a extensão ".dat", como no código abaixo:

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

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


Outra variante muito legível para o Python 3.4+ é usando pathlib.Path.glob:

print(files_list)
['file1.txt', 'file2.txt', .... ]

É simples tornar mais específico, por exemplo, apenas procurar por arquivos fonte Python que não sejam links simbólicos, também em todos os subdiretórios:

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

Usando geradores

# python 2.x
import scandir
import sys

de = scandir.scandir(sys.argv[1])
while 1:
    try:
        d = de.next()
        print d.path
    except StopIteration as _:
        break

O Python 3.5 introduziu um método novo e mais rápido para percorrer o diretório - os.scandir().

Exemplo:

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

Eu realmente gostei da resposta do Adam , sugerindo que você use glob() , do módulo de mesmo nome. Isso permite que você tenha correspondência de padrões com * s.

Mas, como outras pessoas apontaram nos comentários, glob() pode ser tropeçado em direções de barra inconsistentes. Para ajudar com isso, sugiro que você use as funções join() e expanduser() no módulo os.path e, talvez, também a função getcwd() no módulo os .

Como exemplos:

from glob import glob

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

O acima é terrível - o caminho foi codificado e só funcionará no Windows entre o nome da unidade e o código codificado no caminho.

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

O acima funciona melhor, mas depende do nome da pasta Users que é freqüentemente encontrado no Windows e não tão freqüentemente encontrado em outros sistemas operacionais. Também depende do usuário ter um nome 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'))

Isso funciona perfeitamente em todas as plataformas.

Outro ótimo exemplo que funciona perfeitamente entre plataformas e faz algo um pouco 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 esses exemplos ajudem você a ver o poder de algumas das funções que você pode encontrar nos módulos padrão da biblioteca Python.


Vamos dar o nome lst à lista que você tem. Pode-se converter a lista lst para um numpy array . E, em seguida, use numpy.where para obter o índice do item escolhido na lista. A seguir é a maneira em que você irá implementá-lo.

 import numpy as np lst = ["foo", "bar", "baz"] #lst: : 'list' data type lst_np = np.array(lst) #lst_np: 'numpy.ndarray' index = np.where( lst_np == 'bar')[0][0] #index: 'numpy.int64' data type print index 1 




python directory