¿Cómo puedo encontrar todos los archivos en un directorio que tiene la extensión .txt
en Python?
1043
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 desea recorrer el directorio, 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))
for file in f
que parafor files in f
ya que lo que está en la variable es un solo nombre de archivo. Aún mejor sería cambiar elf
afiles
y luego los bucles for podrían convertirsefor file in files
.file
no es una palabra reservada, solo el nombre de una función predefinida, por lo que es muy posible usarla como un nombre de variable en su propio código. Aunque es cierto que generalmente uno debe evitar colisiones como esa,file
es un caso especial porque casi nunca hay necesidad de usarlo, por lo que a menudo se considera una excepción a la guía. Si no desea hacer eso, PEP8 recomienda agregar un solo guión bajo a dichos nombres, es decirfile_
, lo que debe aceptar es bastante legible.Usa glob .
fuente
glob
no puede encontrar archivos de forma recursiva si su python es inferior a 3.5. más informarAlgo así debería hacer el trabajo
fuente
root, dirs, files
lugar der, d, f
. Mucho más legible.Algo como esto funcionará:
fuente
os.path.join
en cada elemento detext_files
. Podría ser algo asítext_files = [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.txt')]
.Simplemente puede usar
pathlib
s 1 :glob
o en un bucle:
Si lo quieres recursivo puedes usar
.glob('**/*.txt)
1 El
pathlib
módulo se incluyó en la biblioteca estándar en Python 3.4. Pero puede instalar puertos posteriores de ese módulo incluso en versiones anteriores de Python (es decir, usandoconda
opip
):pathlib
ypathlib2
.fuente
**/*.txt
no es compatible con versiones anteriores de Python, así que resolví esto con:foundfiles= subprocess.check_output("ls **/*.txt", shell=True)
for foundfile in foundfiles.splitlines():
print foundfile
pathlib
puede hacer y ya incluí los requisitos de la versión de Python. :) Pero si su enfoque no se ha publicado ya, ¿por qué no agregarlo como otra respuesta?rglob
si desea buscar elementos de forma recursiva. Por ejemplo.rglob('*.txt')
fuente
Me gusta os.walk () :
O con generadores:
fuente
Aquí hay más versiones de la misma que producen resultados ligeramente diferentes:
glob.iglob ()
glob.glob1 ()
fnmatch.filter ()
fuente
glob1()
es una función auxiliar en elglob
módulo que no figura en la documentación de Python. Hay algunos comentarios en línea que describen lo que hace en el archivo fuente, vea.../Lib/glob.py
.glob.glob1()
no es público pero está disponible en Python 2.4-2.7; 3.0-3.2; pypy jython github.com/zed/test_glob1glob
módulo.path.py es otra alternativa: https://github.com/jaraco/path.py
fuente
for f in p.walk(pattern='*.txt')
ir a través de todas las subcarpetaslist(p.glob('**/*.py'))
Python v3.5 +
Método rápido usando os.scandir en una función recursiva. Busca todos los archivos con una extensión específica en la carpeta y subcarpetas.
Actualización de abril de 2019
Si está buscando en directorios que contienen archivos de 10.000, agregar a una lista se vuelve ineficiente. 'Ceder' los resultados es una mejor solución. También he incluido una función para convertir la salida a un marco de datos de Pandas.
fuente
Python tiene todas las herramientas para hacer esto:
fuente
all_txt_files = list(filter(lambda x: x.endswith('.txt'), os.listdir(the_dir)))
Para obtener todos los nombres de archivo '.txt' dentro de la carpeta 'dataPath' como una lista de manera pitónica:
fuente
Intente esto, encontrará todos sus archivos de forma recursiva:
fuente
**
. Solo disponible en python 3. Lo que no me gusta es lachdir
pieza. No hay necesidad de eso.filepath = os.path.join('wallpaper')
y luego usarla comoglob.glob(filepath+"**/*.psd", recursive = True)
, lo que produciría el mismo resultado.fuente
Hice una prueba (Python 3.6.4, W7x64) para ver qué solución es la más rápida para una carpeta, sin subdirectorios, para obtener una lista de rutas de archivos completas para archivos con una extensión específica.
Para abreviar, esta tarea
os.listdir()
es la más rápida y es 1.7 veces más rápida que la siguiente mejor:os.walk()
(¡con un descanso!), 2.7 veces más rápidapathlib
, 3.2 veces más rápidaos.scandir()
y 3.3 veces más rápida queglob
.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.
Resultados:
fuente
Este código hace que mi vida sea más simple.
fuente
Use fnmatch: https://docs.python.org/2/library/fnmatch.html
fuente
Para obtener una matriz de nombres de archivo ".txt" de una carpeta llamada "datos" en el mismo directorio, generalmente uso esta simple línea de código:
fuente
Le sugiero que use fnmatch y el método superior. De esta manera puede encontrar cualquiera de los siguientes:
.
fuente
Aquí hay uno con
extend()
fuente
.txt
:)Solución funcional con subdirectorios:
fuente
En caso de que la carpeta contenga muchos archivos o la memoria sea una restricción, considere usar generadores:
Opción A: iterar
Opción B: obtener todo
fuente
Una solución copiable y similar a la de ghostdog:
fuente
use el módulo Python OS para buscar archivos con extensión específica.
El ejemplo simple está aquí:
fuente
Muchos usuarios han respondido con
os.walk
respuestas, que incluyen todos los archivos pero también todos los directorios y subdirectorios y sus archivos.O para uno que no necesita un generador:
Si va a utilizar coincidencias para otra cosa, es posible que desee que sea una lista en lugar de una expresión generadora:
fuente
Un método simple mediante el uso de
for
bucle:Aunque esto se puede hacer más generalizado.
fuente