glob — Coincidencia de patrón de nombre de archivo¶
Propósito: | Usa las reglas de shell de Unix para buscar nombres de archivos que coincidan con un patrón. |
---|
Aunque la interfaz de glob
es pequeña, el módulo incluye una gran cantidad
de poder. Es útil en cualquier situación donde un programa necesita buscar una
lista de archivos en el sistema de archivos con nombres que coinciden con un
patrón. Para crear una lista de nombres de archivos que tengan una cierta
extensión, prefijo, o cualquier cadena común en el medio, usa glob
en lugar
de escribir código personalizado para escanear los contenidos del directorio.
Las reglas de patrón para glob
no son las mismas que las expresiones
regulares usadas por el módulo re
. En cambio, siguen reglas de
expansión de ruta estándar de Unix. Solo hay unos pocos caracteres especiales
utilizados para implementar dos caracteres comodines y rangos diferentes. Las
reglas de patrón se aplican a segmentos del nombre de archivo (deteniéndose en
el separador de ruta, /
). Las rutas en el patrón pueden ser relativas o
absolutas. Los nombres de variable de shell y tilde (~
) no son expandidos.
Datos de ejemplo¶
Los ejemplos en esta sección suponen que los siguientes archivos de prueba están presentes en el directorio de trabajo actual.
$ python3 glob_maketestdata.py
dir
dir/file.txt
dir/file1.txt
dir/file2.txt
dir/filea.txt
dir/fileb.txt
dir/file?.txt
dir/file*.txt
dir/file[.txt
dir/subdir
dir/subdir/subfile.txt
Si estos archivos no existen, usa glob_maketestdata.py
en el código de
muestra para crearlos antes de ejecutar los siguientes ejemplos.
Comodines¶
Un asterisco (*
) coincide con cero o más caracteres en un segmento de un
nombre. Por ejemplo, dir/*
.
import glob
for name in sorted(glob.glob('dir/*')):
print(name)
El patrón coincide con cada nombre de ruta (archivo o directorio) en el
directorio dir, sin recurrir más a los subdirectorios. Los datos devueltos por
glob()
no están ordenados, por lo que los ejemplos aquí los ordenan para
hacer que el estudio de los resultados sea más fácil.
$ python3 glob_asterisk.py
dir/file*.txt
dir/file.txt
dir/file1.txt
dir/file2.txt
dir/file?.txt
dir/file[.txt
dir/filea.txt
dir/fileb.txt
dir/subdir
Para listar archivos en un subdirectorio, el subdirectorio debe incluirse en el patrón.
import glob
print('Named explicitly:')
for name in sorted(glob.glob('dir/subdir/*')):
print(' {}'.format(name))
print('Named with wildcard:')
for name in sorted(glob.glob('dir/*/*')):
print(' {}'.format(name))
El primer caso mostrado anteriormente enumera el nombre del subdirectorio de forma explícita, mientras que el segundo caso depende de un comodín para encontrar el directorio.
$ python3 glob_subdir.py
Named explicitly:
dir/subdir/subfile.txt
Named with wildcard:
dir/subdir/subfile.txt
Los resultados, en este caso, son iguales. Si hubiera otro subdirectorio, el comodín coincidiría con ambos subdirectorios e incluiría los nombres de archivo de ambos.
Carácter comodín individual¶
Un signo de interrogación (?
) Es otro carácter comodín. Coincide con
cualquier carácter solo en esa posición en el nombre.
import glob
for name in sorted(glob.glob('dir/file?.txt')):
print(name)
El ejemplo anterior coincide con todos los nombres de archivo que comienzan con
file
, tiene un carácter más de cualquier tipo, y luego termina con
.txt
.
$ python3 glob_question.py
dir/file*.txt
dir/file1.txt
dir/file2.txt
dir/file?.txt
dir/file[.txt
dir/filea.txt
dir/fileb.txt
Rangos de caracteres¶
Usa un rango de caracteres ([a-z]
) en lugar de un signo de interrogación
para hacer coincidir uno de varios caracteres. Este ejemplo encuentra todos
los archivos con un dígito en el nombre antes de la extensión.
import glob
for name in sorted(glob.glob('dir/*[0-9].*')):
print(name)
El rango de caracteres [0-9]
coincide con cualquier dígito. El rango es
ordenado basado en el código de carácter para cada letra/dígito, y el guión
indica un rango ininterrumpido de caracteres secuenciales. El mismo el valor
del rango podría escribirse [0123456789]
.
$ python3 glob_charrange.py
dir/file1.txt
dir/file2.txt
Escapando meta-caracteres¶
A veces es necesario buscar archivos con nombres que contiene los meta
caracteres especiales que glob
usa para sus patrones. La función
escape()
construye un patrón adecuado con el caracteres especial
«escapados» para que no se expandan o interpreten como especiales por glob
.
import glob
specials = '?*['
for char in specials:
pattern = 'dir/*' + glob.escape(char) + '.txt'
print('Searching for: {!r}'.format(pattern))
for name in sorted(glob.glob(pattern)):
print(name)
print()
Cada carácter especial se escapa creando un rango de caracteres que contiene una sola entrada.
$ python3 glob_escape.py
Searching for: 'dir/*[?].txt'
dir/file?.txt
Searching for: 'dir/*[*].txt'
dir/file*.txt
Searching for: 'dir/*[[].txt'
dir/file[.txt
Ver también
- Documentación de la biblioteca estándar para glob
- Notación de coincidencia de patrones – Una explicación de globbing de la especificación del lenguaje de comando del shell de Open Group.
fnmatch
– Implementación de la correspondencia de nombre de archivo.- Notas para portar Python 2 a 3 para glob