from - python regex space
patrón de exclusión global (6)
Tengo un directorio con un montón de archivos dentro: eee2314
, asd3442
... y eph
.
Quiero excluir todos los archivos que comienzan con eph
con la función glob
.
¿Cómo puedo hacerlo?
Como lo mencionó la respuesta aceptada, no puede excluir patrones con glob, así que el siguiente es un método para filtrar el resultado de su glob.
La respuesta aceptada es probablemente la mejor forma pitónica de hacer las cosas, pero si crees que las comprensiones de la lista son un poco feas y quieres que tu código sea el máximo numpythonic de todos modos (como lo hice), entonces puedes hacer esto (pero ten en cuenta que probablemente sea menos eficiente que el método de comprensión de la lista):
import glob
data_files = glob.glob("path_to_files/*.fits")
light_files = np.setdiff1d( data_files, glob.glob("*BIAS*"))
light_files = np.setdiff1d(light_files, glob.glob("*FLAT*"))
(En mi caso, tenía algunos marcos de imagen, marcos de sesgo y marcos planos en un directorio y solo quería los marcos de imagen)
Las reglas de patrón para glob no son expresiones regulares. En su lugar, siguen las reglas de expansión de ruta de Unix estándar. Solo hay unos pocos caracteres especiales: dos comodines diferentes, y los rangos de caracteres son compatibles [desde glob ].
Así que puedes excluir algunos archivos con patrones.
Por ejemplo, para excluir archivos de manifiesto (archivos que comienzan con _
) con glob, puede usar:
files = glob.glob(''files_path/[!_]*'')
Más generalmente, para excluir archivos que no cumplan con alguna fnmatch
shell, podría usar el módulo fnmatch
:
import fnmatch
file_list = glob(''somepath'')
for ind, ii in enumerate(file_list):
if not fnmatch.fnmatch(ii, ''bash_regexp_with_exclude''):
file_list.pop(ind)
Lo anterior primero generará una lista a partir de una ruta dada y luego saldrá los archivos que no satisfagan la expresión regular con la restricción deseada.
No se pueden excluir patrones con la función glob
, los globs solo permiten patrones de inclusión . La sintaxis de Globbing es muy limitada (incluso una clase de caracteres [!..]
debe coincidir con un carácter, por lo que es un patrón de inclusión para todos los caracteres que no están en la clase).
Tendrás que hacer tu propio filtrado. Una lista de comprensión por lo general funciona bien aquí:
files = [fn for fn in glob(''somepath/*.txt'')
if not os.path.basename(fn).startswith(''eph'')]
Puedes deducir conjuntos:
set(glob("*")) - set(glob("eph"))
Tarde en el juego, pero también puedes aplicar un filter
python al resultado de un glob
:
files = glob.iglob(''your_path_here'')
files_i_care_about = filter(lambda x: not x.startswith("eph"), files)
o reemplazando la lambda con una búsqueda de expresiones regulares apropiada, etc.
EDITAR: Me acabo de dar cuenta de que si está usando rutas completas, las startswith
no funcionarán, por lo que necesitaría una expresión regular
In [10]: a
Out[10]: [''/some/path/foo'', ''some/path/bar'', ''some/path/eph_thing'']
In [11]: filter(lambda x: not re.search(''/eph'', x), a)
Out[11]: [''/some/path/foo'', ''some/path/bar'']