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/*.

glob_asterisk.py
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.

glob_subdir.py
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.

glob_question.py
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.

glob_charrange.py
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.

glob_escape.py
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