Intento recorrer todos los archivos que coinciden con una determinada extensión, incluidos los que se encuentran dentro de carpetas ocultas. Hasta ahora no he encontrado una manera de hacer esto con iglob . Esto funciona para todas las carpetas excepto aquellas que comienzan con un punto:
import glob for filename in glob.iglob('/path/**/*.ext', recursive=True): print(filename) He intentado agregar el punto como un carácter opcional sin éxito. Realmente me gustaría usar glob en lugar de residir en os.walk .
Cómo incluir todos los archivos/carpetas, incluso aquellos que comienzan con . , con glob ?
Tuve este mismo problema y deseaba que glob.glob tuviera un parámetro opcional para incluir archivos de puntos. Quería poder incluir TODOS los archivos de puntos en TODOS los directorios, incluidos los directorios que comienzan con punto. Simplemente no es posible hacer esto con glob.glob. Sin embargo, descubrí que Python tiene un módulo estándar pathlib que tiene una función global que funciona de manera diferente, incluirá archivos de puntos. La función opera de manera un poco diferente, en particular, no devuelve una lista de cadenas, sino objetos de ruta. Sin embargo, usé lo siguiente
files=[] file_refs = pathlib.Path(".").glob(pattern) for file in file_refs: files.append(str(file))La otra diferencia notable que encontré fue un patrón global que termina con **. Esto no devolvió nada en la versión de pathlib pero devolvería todos los archivos en la versión glob.glob. Para obtener los mismos resultados, agregué una línea para verificar si el patrón terminaba con ** y, de ser así, le agregué /*.
El siguiente código es un reemplazo para su ejemplo que incluye los archivos en directorios que comienzan con punto
import pathlib for fileref in pathlib.Path('/path/').glob('**/*.ext'): filename = str(fileref) print(filename)De https://docs.python.org/3/library/glob.html
Tenga en cuenta que, a diferencia de fnmatch.fnmatch(), glob trata los nombres de archivo que comienzan con un punto (.) como casos especiales.
Si el directorio contiene archivos que comienzan con . no coincidirán de forma predeterminada. Por ejemplo, considere un directorio que contenga card.gif y .card.gif:
import glob glob.glob('*.gif') # ['card.gif'] glob.glob('.c*') # ['.card.gif']
Por lo que veo, se requieren dos globos separados para obtener los ocultos y los no ocultos, por ejemplo, usando https://stackoverflow.com/a/4829130/4130619 .
Agregar una respuesta para la pregunta de recompensa; obteniendo el resultado de archivos ocultos y no ocultos en un solo comando.
Como mencionó la actividad de @reducidng, glob treats . archivos como un caso de uso especial. Para obtener archivos normales y ocultos en un solo ciclo, podemos usar itertools.chain con iteradores glob.iglob . por ejemplo,
→ ls -A .chen file.text so1.py >>> import glob, itertools >>> for i in itertools.chain(glob.iglob('**'), glob.iglob('.**')): ... print(i) ... file.text so1.py .chen # If you want it as a variable, you can list() it. >>> l = list(itertools.chain(glob.iglob('**'), glob.iglob('.**'))) >>> l ['file.text', 'so1.py', '.chen'] >>> Nota: no funciona completamente (todavía). Digamos que tiene .hello , .dot/hello.txt , .dot/.hello.txt , nodot/hello.txt , nodot/.hello.txt . Entonces tampoco:
itertools.chain(glob.iglob('**', recursive=True), glob.iglob('.**', recursive=True))ni
itertools.chain(glob.iglob('**/*', recursive=True), glob.iglob('.**/*', recursive=True))dar todos los archivos.