from - read file names in folder python




Encontre todos os arquivos em um diretório com extensão.txt em Python (20)

Python v3.5 +

Método rápido usando os.scandir em uma função recursiva. Procura por todos os arquivos com uma extensão especificada na pasta e nas subpastas.

import os

def findFilesInFolder(path, pathList, extension, subFolders = True):
    """  Recursive function to find all files of an extension type in a folder (and optionally in all subfolders too)

    path:        Base directory to find files
    pathList:    A list that stores all paths
    extension:   File extension to find
    subFolders:  Bool.  If True, find files in all subfolders under path. If False, only searches files in the specified folder
    """

    try:   # Trapping a OSError:  File permissions problem I believe
        for entry in os.scandir(path):
            if entry.is_file() and entry.path.endswith(extension):
                pathList.append(entry.path)
            elif entry.is_dir() and subFolders:   # if its a directory, then repeat process as a nested function
                pathList = findFilesInFolder(entry.path, pathList, extension, subFolders)
    except OSError:
        print('Cannot access ' + path +'. Probably a permissions error')

    return pathList

dir_name = r'J:\myDirectory'
extension = ".txt"

pathList = []
pathList = findFilesInFolder(dir_name, pathList, extension, True)

Como posso encontrar todos os arquivos em um diretório com a extensão .txt em python?


Algo assim deveria fazer o trabalho

for root, dirs, files in os.walk(directory):
    for file in files:
        if file.endswith('.txt'):
            print file

Aqui está um com extend()

types = ('*.jpg', '*.png')
images_list = []
for files in types:
    images_list.extend(glob.glob(os.path.join(path, files)))

Caso a pasta contenha muitos arquivos ou a memória seja uma restrição, considere usar geradores:

def yield_files_with_extensions(folder_path, file_extension):
   for _, _, files in os.walk(folder_path):
       for file in files:
           if file.endswith(file_extension):
               yield file

Opção A: Iterar

for f in yield_files_with_extensions('.', '.txt'): 
    print(f)

Opção B: obter tudo

files = [f for f in yield_files_with_extensions('.', '.txt')]

Eu gosto de os.walk() :

import os, os.path

for root, dirs, files in os.walk(dir):
    for f in files:
        fullpath = os.path.join(root, f)
        if os.path.splitext(fullpath)[1] == '.txt':
            print fullpath

Ou com geradores:

import os, os.path

fileiter = (os.path.join(root, f)
    for root, _, files in os.walk(dir)
    for f in files)
txtfileiter = (f for f in fileiter if os.path.splitext(f)[1] == '.txt')
for txt in txtfileiter:
    print txt

Eu sugiro que você use https://docs.python.org/2/library/fnmatch.html e o método superior. Desta forma, você pode encontrar qualquer um dos seguintes:

  1. Nome. txt ;
  2. Nome. TXT ;
  3. Nome. TXT

.

import fnmatch
import os

    for file in os.listdir("/Users/Johnny/Desktop/MyTXTfolder"):
        if fnmatch.fnmatch(file.upper(), '*.TXT'):
            print(file)

Muitos usuários responderam com os.walk respostas do os.walk , que inclui todos os arquivos, mas também todos os diretórios e subdiretórios e seus arquivos.

import os


def files_in_dir(path, extension=''):
    """
       Generator: yields all of the files in <path> ending with
       <extension>

       \param   path       Absolute or relative path to inspect,
       \param   extension  [optional] Only yield files matching this,

       \yield              [filenames]
    """


    for _, dirs, files in os.walk(path):
        dirs[:] = []  # do not recurse directories.
        yield from [f for f in files if f.endswith(extension)]

# Example: print all the .py files in './python'
for filename in files_in_dir('./python', '*.py'):
    print("-", filename)

Ou para um fora onde você não precisa de um gerador:

path, ext = "./python", ext = ".py"
for _, _, dirfiles in os.walk(path):
    matches = (f for f in dirfiles if f.endswith(ext))
    break

for filename in matches:
    print("-", filename)

Se você vai usar correspondências para outra coisa, você pode querer fazer uma lista ao invés de uma expressão geradora:

    matches = [f for f in dirfiles if f.endswith(ext)]

O path.py é outra alternativa: https://github.com/jaraco/path.py

from path import path
p = path('/path/to/the/directory')
for f in p.files(pattern='*.txt'):
    print f

Para obter uma matriz de nomes de arquivos ".txt" de uma pasta chamada "data" no mesmo diretório, geralmente uso essa linha simples de código:

import os
fileNames = [fileName for fileName in os.listdir("data") if fileName.endswith(".txt")]

Python tem todas as ferramentas para fazer isso:

import os

the_dir = 'the_dir_that_want_to_search_in'
all_txt_files = filter(lambda x: x.endswith('.txt'), os.listdir(the_dir))

Tente isso, isso vai encontrar todo o seu arquivo dentro de pasta ou pasta

import glob, os
os.chdir("H:\\wallpaper")# use whatever you directory 

#double\\ no single \

for file in glob.glob("**/*.psd", recursive = True):#your format
    print(file)

Um método simples usando loop for :

import os

dir = ["e","x","e"]

p = os.listdir('E:')  #path

for n in range(len(p)):
   name = p[n]
   myfile = [name[-3],name[-2],name[-1]]  #for .txt
   if myfile == dir :
      print(name)
   else:
      print("nops")

Embora isso possa ser generalizado.


Use glob .

>>> import glob
>>> glob.glob('./*.txt')
['./outline.txt', './pip-log.txt', './test.txt', './testingvim.txt']


Veja mais versões do mesmo que produzem resultados ligeiramente diferentes:

glob.iglob()

import glob
for f in glob.iglob("/mydir/*/*.txt"): # generator, search immediate subdirectories 
    print f

glob.glob1 ()

print glob.glob1("/mydir", "*.tx?")  # literal_directory, basename_pattern

fnmatch.filter()

import fnmatch, os
print fnmatch.filter(os.listdir("/mydir"), "*.tx?") # include dot-files

Você pode simplesmente usar o glob 1 do pathlib :

import pathlib

list(pathlib.Path('your_directory').glob('*.txt'))

ou em um loop:

for txt_file in pathlib.Path('your_directory').glob('*.txt'):
    # do something with "txt_file"

Se você quiser recursiva, você pode usar .glob('**/*.txt)

1 O módulo pathlib foi incluído na biblioteca padrão no python 3.4. Mas você pode instalar back-ports desse módulo mesmo em versões mais antigas do Python (ou seja, usando conda ou pip ): pathlib e pathlib2 .


Você pode tentar este código:

import glob
import os

os.chdir("D:\...\DirName")
filename_arr={}
i=0
for files in glob.glob("*.txt"):
    filename_arr[i] = files
    i= i+1

for key,value in filename_arr.items():
    print key , value

Você pode usar glob :

import glob, os
os.chdir("/mydir")
for file in glob.glob("*.txt"):
    print(file)

ou simplesmente os.listdir :

import os
for file in os.listdir("/mydir"):
    if file.endswith(".txt"):
        print(os.path.join("/mydir", file))

ou se você quiser percorrer o diretório, use os.walk :

import os
for root, dirs, files in os.walk("/mydir"):
    for file in files:
        if file.endswith(".txt"):
             print(os.path.join(root, file))

import glob,os

data_dir = 'data_folder/'
file_dir_extension = os.path.join(data_dir, '*.txt')

for file_name in glob.glob(file_dir_extension):
    if file_name.endswith('.txt'):
        print file_name

Para mim. É clássico.


import os

path = 'mypath/path' 
files = os.listdir(path)

files_txt = [i for i in files if i.endswith('.txt')]




file-io