instalar - uninstall python linux
Ignorar caso en glob() en Linux (4)
Use expresiones regulares insensibles a mayúsculas y minúsculas en lugar de patrones glob. fnmatch.translate
genera una expresión regular a partir de un patrón glob, por lo que
re.compile(fnmatch.translate(pattern), re.IGNORECASE)
le proporciona una versión insensible a mayúsculas y minúsculas de un patrón global como un RE compilado.
Tenga en cuenta que, si el sistema de archivos está alojado en una caja Linux en un sistema de archivos tipo Unix, los usuarios podrán crear archivos foo
, Foo
y FOO
en el mismo directorio.
Estoy escribiendo un script que tendrá que funcionar en directorios que son modificados a mano por usuarios de Windows y Linux por igual. Los usuarios de Windows tienden a no preocuparse en absoluto por la asignación de nombres de archivos.
¿Hay alguna manera de manejar esto en el lado de Linux en Python, es decir, puedo obtener un comportamiento similar a un caso sin sensibilidad a las mayúsculas y minúsculas?
Puede reemplazar cada carácter alfabético c por [cC], a través de
import glob
def insensitive_glob(pattern):
def either(c):
return ''[%s%s]''%(c.lower(),c.upper()) if c.isalpha() else c
return glob.glob(''''.join(map(either,pattern)))
No recursivo
Para recuperar los archivos (y solo los archivos) de un directorio "ruta", con "globexpression":
list_path = [i for i in os.listdir(path) if os.path.isfile(os.path.join(path, i))]
result = [os.path.join(path, j) for j in list_path if re.match(fnmatch.translate(globexpression), j, re.IGNORECASE)]
Recursivamente
con caminar:
result = []
for root, dirs, files in os.walk(path, topdown=True):
result += [os.path.join(root, j) for j in files /
if re.match(fnmatch.translate(globexpression), j, re.IGNORECASE)]
Mejor también compila la expresión regular, así que en lugar de
re.match(fnmatch.translate(globexpression)
do (antes del ciclo):
reg_expr = re.compile(fnmatch.translate(globexpression), re.IGNORECASE)
y luego reemplazar en el ciclo:
result += [os.path.join(root, j) for j in files if re.match(reg_expr, j)]
Dependiendo de su caso, puede usar .lower()
en el patrón de archivo y los resultados de la lista de carpetas y solo luego comparar el patrón con el nombre del archivo