ruta - Encuentre todos los archivos en un directorio con extensión.txt en Python
que es un directorio en python (30)
¿Cómo puedo encontrar todos los archivos en un directorio que tenga la extensión .txt
en python?
Python v3.5 +
Método rápido utilizando os.scandir en una función recursiva. Busca todos los archivos con una extensión específica en carpetas y subcarpetas.
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)
Algo así debería hacer el trabajo.
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(''.txt''):
print file
Algo como esto funcionará:
>>> import os
>>> path = ''/usr/share/cups/charmaps''
>>> text_files = [f for f in os.listdir(path) if f.endswith(''.txt'')]
>>> text_files
[''euc-cn.txt'', ''euc-jp.txt'', ''euc-kr.txt'', ''euc-tw.txt'', ... ''windows-950.txt'']
Aquí hay más versiones del mismo que producen resultados ligeramente 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
Aquí hay uno con extend()
types = (''*.jpg'', ''*.png'')
images_list = []
for files in types:
images_list.extend(glob.glob(os.path.join(path, files)))
En caso de que la carpeta contenga muchos archivos o la memoria sea una restricción, considere usar generadores:
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
Opción A: Iterar
for f in yield_files_with_extensions(''.'', ''.txt''):
print(f)
Opción B: obtener todo
files = [f for f in yield_files_with_extensions(''.'', ''.txt'')]
Este código hace mi vida más simple.
import os
fnames = ([file for root, dirs, files in os.walk(dir)
for file in files
if file.endswith(''.txt'') #or file.endswith(''.png'') or file.endswith(''.pdf'')
])
for fname in fnames: print(fname)
Hice una prueba (Python 3.6.4, W7x64) para ver qué solución es la más rápida para una carpeta, no subdirectorios, para obtener una lista de rutas de archivos completas para archivos con una extensión específica.
Para abreviar, para esta tarea, os.listdir()
es el más rápido y es 1.7x tan rápido como el mejor: os.walk()
(¡con un os.walk()
!), 2.7x tan rápido como pathlib
, 3.2x más rápido que os.scandir()
y 3.3x más rápido que glob
.
Tenga en cuenta que esos resultados cambiarán cuando necesite resultados recursivos. Si copia / pega un método a continuación, agregue un .lower () de lo contrario, no se encontrará .EXT al buscar .ext.
import os
import pathlib
import timeit
import glob
def a():
path = pathlib.Path().cwd()
list_sqlite_files = [str(f) for f in path.glob("*.sqlite")]
def b():
path = os.getcwd()
list_sqlite_files = [f.path for f in os.scandir(path) if os.path.splitext(f)[1] == ".sqlite"]
def c():
path = os.getcwd()
list_sqlite_files = [os.path.join(path, f) for f in os.listdir(path) if f.endswith(".sqlite")]
def d():
path = os.getcwd()
os.chdir(path)
list_sqlite_files = [os.path.join(path, f) for f in glob.glob("*.sqlite")]
def e():
path = os.getcwd()
list_sqlite_files = [os.path.join(path, f) for f in glob.glob1(str(path), "*.sqlite")]
def f():
path = os.getcwd()
list_sqlite_files = []
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith(".sqlite"):
list_sqlite_files.append( os.path.join(root, file) )
break
print(timeit.timeit(a, number=1000))
print(timeit.timeit(b, number=1000))
print(timeit.timeit(c, number=1000))
print(timeit.timeit(d, number=1000))
print(timeit.timeit(e, number=1000))
print(timeit.timeit(f, number=1000))
Resultados:
# Python 3.6.4
0.431
0.515
0.161
0.548
0.537
0.274
Me gusta 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
O con generadores:
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
Muchos usuarios han respondido con os.walk
respuestas de os.walk
, que incluyen todos los archivos pero también todos los directorios y subdirectorios y sus archivos.
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)
O para un solo donde no necesita un generador:
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)
Si va a usar coincidencias para otra cosa, puede hacer una lista en lugar de una expresión generadora:
matches = [f for f in dirfiles if f.endswith(ext)]
Para obtener todos los nombres de archivos ''.txt'' dentro de la carpeta ''dataPath'' como una lista de forma Pythonic
from os import listdir
from os.path import isfile, join
path = "/dataPath/"
onlyTxtFiles = [f for f in listdir(path) if isfile(join(path, f)) and f.endswith(".txt")]
print onlyTxtFiles
Para obtener una matriz de nombres de archivos ".txt" de una carpeta llamada "datos" en el mismo directorio, generalmente uso esta simple línea de código:
import os
fileNames = [fileName for fileName in os.listdir("data") if fileName.endswith(".txt")]
Prueba esto, encontrarás todo tu archivo dentro de la carpeta o carpeta.
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)
Puedes probar este código
import glob
import os
filenames_without_extension = [os.path.basename(c).split(''.'')[0:1][0] for c in glob.glob(''your/files/dir/*.txt'')]
filenames_with_extension = [os.path.basename(c) for c in glob.glob(''your/files/dir/*.txt'')]
Puedes probar 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
Puedes usar glob
:
import glob, os
os.chdir("/mydir")
for file in glob.glob("*.txt"):
print(file)
o simplemente os.listdir
:
import os
for file in os.listdir("/mydir"):
if file.endswith(".txt"):
print(os.path.join("/mydir", file))
o si quieres atravesar el directorio, usa 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))
Python tiene todas las herramientas para hacer esto:
import os
the_dir = ''the_dir_that_want_to_search_in''
all_txt_files = filter(lambda x: x.endswith(''.txt''), os.listdir(the_dir))
Simplemente puede usar pathlib
s glob
1 :
import pathlib
list(pathlib.Path(''your_directory'').glob(''*.txt''))
o en un bucle:
for txt_file in pathlib.Path(''your_directory'').glob(''*.txt''):
# do something with "txt_file"
Si lo quieres recursivo puedes usar .glob(''**/*.txt)
1 El módulo pathlib
se incluyó en la biblioteca estándar en Python 3.4. Pero puede instalar back-ports de ese módulo incluso en versiones anteriores de Python (es decir, usar conda
o pip
): pathlib
y pathlib2
.
Solución funcional con subdirectorios:
from fnmatch import filter
from functools import partial
from itertools import chain
from os import path, walk
print(*chain(*(map(partial(path.join, root), filter(filenames, "*.txt")) for root, _, filenames in walk("mydir"))))
Te sugiero que uses https://docs.python.org/2/library/fnmatch.html y el método superior. De esta forma podrás encontrar alguno de los siguientes:
- Nombre. txt
- Nombre. TXT ;
- Nombre. TXT
.
import fnmatch
import os
for file in os.listdir("/Users/Johnny/Desktop/MyTXTfolder"):
if fnmatch.fnmatch(file.upper(), ''*.TXT''):
print(file)
Un método simple mediante el uso for
bucle:
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")
Aunque esto se puede hacer más generalizado.
Una solución de copia-pasable similar a la de ghostdog:
def get_all_filepaths(root_path, ext):
"""
Search all files which have a given extension within root_path.
This ignores the case of the extension and searches subdirectories, too.
Parameters
----------
root_path : str
ext : str
Returns
-------
list of str
Examples
--------
>>> get_all_filepaths(''/run'', ''.lock'')
[''/run/unattended-upgrades.lock'',
''/run/mlocate.daily.lock'',
''/run/xtables.lock'',
''/run/mysqld/mysqld.sock.lock'',
''/run/postgresql/.s.PGSQL.5432.lock'',
''/run/network/.ifstate.lock'',
''/run/lock/asound.state.lock'']
"""
import os
all_files = []
for root, dirs, files in os.walk(root_path):
for filename in files:
if filename.lower().endswith(ext):
all_files.append(os.path.join(root, filename))
return all_files
Utilice glob .
>>> import glob
>>> glob.glob(''./*.txt'')
[''./outline.txt'', ''./pip-log.txt'', ''./test.txt'', ''./testingvim.txt'']
Utilice fnmatch: https://docs.python.org/2/library/fnmatch.html
import fnmatch
import os
for file in os.listdir(''.''):
if fnmatch.fnmatch(file, ''*.txt''):
print file
path.py es otra 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
use el módulo del OS Python para encontrar archivos con una extensión específica.
El ejemplo simple está aquí:
import os
# This is the path where you want to search
path = r''d:''
# this is extension you want to detect
extension = ''.txt'' # this can be : .jpg .png .xls .log .....
for root, dirs_list, files_list in os.walk(path):
for file_name in files_list:
if os.path.splitext(file_name)[-1] == extension:
file_name_path = os.path.join(root, file_name)
print file_name
print file_name_path # This is the full path of the filter file
import glob
import os
path=os.getcwd()
extensions=(''*.py'',''*.cpp'')
for i in extensions:
for files in glob.glob(i):
print files
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 mi. Es clasico
import os
path = ''mypath/path''
files = os.listdir(path)
files_txt = [i for i in files if i.endswith(''.txt'')]
import os
import sys
if len(sys.argv)==2:
print(''no params'')
sys.exit(1)
dir = sys.argv[1]
mask= sys.argv[2]
files = os.listdir(dir);
res = filter(lambda x: x.endswith(mask), files);
print res