2010-04-07 24 views
13

/Usuarios/smcho/Escritorio/soporte/[10,20] directorio tiene "abc.txt", pero cuando ejecuto el código Pythonglob y soporte de caracteres de 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 Python controlar las letras del corchete u otras?
  • ¿Hay alguna manera de resolver este problema?

Respuesta

14

Los soportes en glob se utilizan para las clases de caracteres (por ejemplo [a-z] coincidirá con letras minúsculas). Se puede poner cada soporte en una clase de caracteres para obligarlos siendo coincidentes:

path1 = "/Users/smcho/Desktop/bracket/[[]10,20[]]" 

[[] es una clase de caracteres que contiene sólo el carácter [, y []] es una clase de caracteres que contiene sólo el carácter ] (el paréntesis de cierre puede ser colocado en una clase de personaje poniéndolo en la primera posición).

Además, como los corchetes no se escapan en literales de cadena, el código buscará una barra diagonal inversa así como un corchete.

+0

@Roger: Gracias, lo he solucionado. – interjay

+2

@ ~ unutbu: No, '[[10,20]]' buscará uno de los caracteres en '[102,' seguido de ']'. No solo dupliqué los corchetes, sino que creé una clase de caracteres: '[[]' es una clase de caracteres que contiene solo el caracter '['. – interjay

+0

Ah sí. Estás en lo correcto. Gracias por la explicación. – unutbu

5

glob utiliza fnmatch debajo del capó. Se podría utilizar directamente:

import fnmatch, os 

names = os.listdir("/Users/smcho/Desktop/bracket/[10,20]") 
print fnmatch.filter(names, '*.txt') 

O usando (no pública) glob.glob1() (que está presente al menos en Python 2.3 + incluyendo 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) 
2

Usted podría utilizar path.replace('[', '[[]') tener rutas de entrada arbitrarias manejados por glob correctamente.