Seleccionar archivos por su extensión con patrones glob

Si desea trabajar con archivos específicos, el método glob() es más sencillo de utilizar que listdir(). Los objetos Path tienen un método glob() para listar el contenido de una carpeta según un patrón glob. Los patrones glob son como una forma simplificada de las expresiones regulares que se utilizan a menudo en los comandos de la línea de comandos. El método glob() devuelve un objeto generador que necesitarás pasar a list() para verlo fácilmente en el shell interactivo:

>>> from pathlib import Path
>>> p = Path('C:/Users/Al/Desktop')
>>> p.glob('*')
<generator object Path.glob at 0x000002A6E389DED0>
>>> list(p.glob('*')) # Make a list from the generator.
[WindowsPath('C:/Users/Al/Desktop/1.png'), WindowsPath('C:/Users/Al/
Desktop/22-ap.pdf'), WindowsPath('C:/Users/Al/Desktop/cat.jpg'),
  --snip--
WindowsPath('C:/Users/Al/Desktop/zzz.txt')]

El asterisco (*) significa «múltiplo de cualquier carácter», por lo que p.glob(*) devuelve un generador de todos los archivos de la ruta almacenada en p.

Al igual que con las expresiones regulares, puede crear expresiones complejas:

>>> list(p.glob('*.txt') # Lists all text files.
[WindowsPath('C:/Users/Al/Desktop/foo.txt'),
  --snip--
WindowsPath('C:/Users/Al/Desktop/zzz.txt')]

El patrón glob '*.txt' devolverá los archivos que empiecen por cualquier combinación de caracteres siempre que terminen con la cadena '.txt', que es la extensión del archivo de texto.

En contraste con el asterisco, el signo de interrogación (?) representa cualquier carácter simple:

>>> list(p.glob('project?.docx')
[WindowsPath('C:/Users/Al/Desktop/project1.docx'), WindowsPath('C:/Users/Al/
Desktop/project2.docx'),
  --snip--
WindowsPath('C:/Users/Al/Desktop/project9.docx')]

La expresión glob ‘project?.docx’ devolverá ‘project1.docx’ o ‘project5.docx’, pero no devolverá ‘project10.docx’, porque ? sólo coincide con un carácter, por lo que no coincidirá con la cadena de dos caracteres «10«.

Por último, también puede combinar el asterisco y el signo de interrogación para crear expresiones glob aún más complejas, como ésta

>>> list(p.glob('*.?x?')
[WindowsPath('C:/Users/Al/Desktop/calc.exe'), WindowsPath('C:/Users/Al/
Desktop/foo.txt'),
  --snip--
WindowsPath('C:/Users/Al/Desktop/zzz.txt')]

La expresión glob '*.?x?' devolverá archivos con cualquier nombre y cualquier extensión de tres caracteres donde el carácter del medio sea una ‘x’.

Al seleccionar archivos con atributos específicos, el método glob() permite especificar fácilmente los archivos de un directorio sobre los que se desea realizar alguna operación. Puedes utilizar un bucle for para iterar sobre el generador que devuelve glob():

>>> p = Path('C:/Users/Al/Desktop')
>>> for textFilePathObj in p.glob('*.txt'):
...     print(textFilePathObj) # Prints the Path object as a string.
...     # Do something with the text file.
...
C:\Users\Al\Desktop\foo.txt
C:\Users\Al\Desktop\spam.txt
C:\Users\Al\Desktop\zzz.txt

Si desea realizar alguna operación en cada archivo de un directorio, puede utilizar os.listdir(p) o p.glob('*').

Deja una respuesta