Hace algunos años trabajé en un proyecto que involucraba la organización de miles de archivos y me topé con un dilema: en un momento llegué a necesitar hacer un filtrado de archivos específicos con base en ciertos patrones complejos, pero no quería perder tiempo escribiendo expresiones regulares desde cero. Ahí fue cuando me encontré con elmódulo de import fnmatch de Python. En esta ocasión te quiero comentar sobre este módulo y cómo es que puedes usarlo en Python.
¿Qué es el módulo fnmatch?
Imagina a fnmatch como un filtro que te permite encontrar la aguja dentro del pajar. Fnmatch es un módulo que se diferencia de las expresiones regulares tradicionales, ya que utiliza patrones de estilo shell de Unix, como son asteriscos, signos de interrogación y rangos de caracteres. Esto hace que sea mucho más intuitivo para trabajar con nombres de archivos y que todo sea mucho más fácil.
Caracteres especiales en fnmatch
Algunos de los caracteres o comodines más conocidos en fnmatch son:
Patrón | Significado |
---|---|
* | Coincide con cualquier número de caracteres. |
? | Coincide con un solo carácter. |
[seq] | Coincide con cualquier carácter en la secuencia. |
[!seq] | Coincide con cualquier carácter que no esté en la secuencia. |
Por ejemplo, si tienes una lista de archivos y quieres encontrar todos los que terminan en .txt, fnmatch hace el trabajo pesado por ti.
¿Cómo usar import fnmatch en Python?
Puedes usar el módulo de import fnmatch de diferentes modos y con diferentes métodos. Veamos algunos:
- fnmatch.fnmatch (filename, pattern): este método puede verificar si un archivo coincide con un patrón dado. Es una función que no distingue entre mayúsculas y minúsculas, por lo cual resulta muy práctico en sistemas operativos como Windows. Veamos un ejemplo:
import fnmatch
import os
# Lista los archivos con extensión .txt en el directorio actual
for file in os.listdir('.'):
if fnmatch.fnmatch(file, '*.txt'):
print(file)
En este código, el patrón *.txt busca todos los archivos con la extensión .txt. Es directo y fácil de entender.
- fnmatch.fnmatchcase: se diferencia del anterior porque distingue entre mayúsculas y minúsculas, independientemente de qué sistema operativo estemos usando. Es bastante útil si necesitas coincidencias estrictas. Veamos:
import fnmatch
print(fnmatch.fnmatchcase('Archivo.TXT', '*.txt')) # Retorna False
🔴 ¿Quieres Aprender a Programar con Python? 🔴
Descubre el Full Stack Jr. Bootcamp - Aprende a Programar desde Cero de KeepCoding. La formación más completa del mercado y con empleabilidad garantizada
👉 Prueba gratis el Bootcamp Aprende a Programar desde Cero por una semanaAquí fnmatchcase no encuentra coincidencias porque diferencia entre TXT y txt.
- fnmatch.filter: Si estás acostumbrado a trabajar con listas grandes, fnmatch.filter (names.pattern) es perfecto para obtener todos los elementos que coinciden con un patrón. Analicemos un ejemplo:
import fnmatch
files = ['data1.txt', 'data2.csv', 'info.txt']
txt_files = fnmatch.filter(files, '*.txt')
print(txt_files) # ['data1.txt', 'info.txt']
Esta función es más eficiente que usar un bucle con condiciones.
- fnmatch.translate: ¿Sabías que es posible convertir un patrón de fnmatch en una expresión regular? ¡Pues sí! y el método fnmatch.translate (pattern) es el que lo hace posible:
import fnmatch, re
regex = fnmatch.translate('*.txt')
print(regex) # '(?s:.*\\.txt)\\Z'
Esto puede ser útil si necesitas usar patrones de fnmatch en contextos que requieren expresiones regulares.
¿Para qué sirve import fnmatch?: algunos casos
El módulo de import fnmatch puede servirnos para algunas operaciones en específico, entre las que encontramos:
- Filtrar archivos en subdirectorios: Aunque fnmatch no trata los separadores como especiales, puedes combinarlo con el módulo os para explorar subdirectorios, del siguiente modo:
import fnmatch
import os
for root, dirs, files in os.walk('.'):
for file in files:
if fnmatch.fnmatch(file, '*.py'):
print(os.path.join(root, file))
Este código encuentra todos los archivos Python en un directorio y sus subdirectorios.
- Combinación con otras herramientas: Fnmatch se puede usar junto con bibliotecas como pandas o numpy para filtrar datos según patrones específicos:
import fnmatch
import pandas as pd
data = pd.DataFrame({'files': ['report1.pdf', 'summary.txt', 'data.csv']})
filtered = data[data['files'].apply(lambda x: fnmatch.fnmatch(x, '*.txt'))]
print(filtered)
Esto filtra los archivos .txt de un DataFrame.
¿Cuándo usar fnmatch en lugar de glob o re?
Pese a que fnmatch es muy bueno en patrones simples, por otro lado no es la opción ideal si necesitas acceder a tareas más elaboradas, como coincidencias complejas o expansiones de rutas. En este caso, puedes considerar usar el módulo glob para manejar directorios y el módulo re para expresiones regulares avanzadas.
Si quieres seguir aprendiendo sobre programación y tecnología y no quieres perderte lo último en estas áreas, puedes unirte a nuestro bootcamp en programación inicial, en donde aprenderás toda la fundamentación teórica y práctica que te permitirá seguir avanzando en el mundo de la programación y conseguir un mejor empleo y status laboral. ¡Inscríbete hoy y construye tu futuro con nosotros!