pilas - Globos de Python y caracteres de corchete(''[]'')
programa analizador de parentesis llaves y corchetes java (4)
En Python 3.4 puedes usar glob.escape
.
El directorio / Users / smcho / Desktop / bracket / [10,20] tiene "abc.txt", pero cuando ejecuto este código Python
import glob
import os.path
path1 = "/Users/smcho/Desktop/bracket//[10,20/]"
pathName = os.path.join(path1, "*.txt")
print glob.glob(pathName)
Devuelve una lista vacía.
- ¿No puede el globo de Python manejar las letras del soporte u otros?
- ¿Hay alguna manera de resolver este problema?
Los corchetes en glob
se utilizan para las clases de caracteres (por ejemplo, [az]
coincidirá con las letras en minúscula). Puedes poner cada corchete en una clase de personaje para forzar que coincidan:
path1 = "/Users/smcho/Desktop/bracket/[[]10,20[]]"
[[]
es una clase de caracteres que contiene solo el carácter [
, y []]
es una clase de caracteres que contiene solo el carácter ]
(el corchete de cierre se puede colocar en una clase de caracteres colocándolo en la primera posición).
Además, dado que los paréntesis no se escapan en los literales de cadena, su código buscará una barra invertida así como un corchete.
Puede usar path.replace(''['', ''[[]'')
para que las rutas de entrada arbitrarias sean manejadas por glob
correctamente.
fnmatch
usa fnmatch
bajo el capó. Podrías usarlo directamente:
import fnmatch, os
names = os.listdir("/Users/smcho/Desktop/bracket/[10,20]")
print fnmatch.filter(names, ''*.txt'')
O usando (no público) glob.glob1()
(está presente al menos en Python 2.3+, incluido Python 3):
import glob
print glob.glob1("/Users/smcho/Desktop/bracket/[10,20]", ''*.txt'')
Aquí está la implementación de glob.glob1
:
def glob1(dirname, pattern):
if not dirname:
dirname = os.curdir
if isinstance(pattern, unicode) and not isinstance(dirname, unicode):
dirname = unicode(dirname, sys.getfilesystemencoding() or
sys.getdefaultencoding())
try:
names = os.listdir(dirname)
except os.error:
return []
if pattern[0] != ''.'':
names = filter(lambda x: x[0] != ''.'', names)
return fnmatch.filter(names, pattern)