2010-04-07 13 views
13

/Users/smcho/Desktop/staffa/[10,20] Directory ha "abc.txt", ma quando ho eseguito questo codice Pythonglob e staffa caratteri Python ('[]')

import glob 
import os.path 

path1 = "/Users/smcho/Desktop/bracket/\[10,20\]" 
pathName = os.path.join(path1, "*.txt") 
print glob.glob(pathName) 

Restituisce una lista vuota.

  • Non è possibile che il glob di Python gestisca le lettere parentesi o altre?
  • C'è un modo per risolvere questo problema?

risposta

14

Le parentesi in glob vengono utilizzate per le classi di caratteri (ad esempio [a-z] corrisponderanno a lettere minuscole). È possibile inserire ogni staffa in una classe di caratteri per imporre loro di essere trovati:

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

[[] è una classe di caratteri contenente solo il carattere [, e []] è una classe di caratteri contenente solo il carattere ] (la parentesi di chiusura può essere inserito in una classe di personaggi mettendolo nella prima posizione).

Inoltre, poiché le parentesi non sono sfuggite in stringhe letterali, il codice cercherà una barra rovesciata e una parentesi.

+0

@Roger: Grazie, l'ho risolto. – interjay

+2

@ ~ unutbu: No, '[[10,20]]' cercherà uno dei caratteri in '[102,' seguito da ']'. Non ho solo raddoppiato le parentesi ma ho creato una classe di caratteri: '[[]' è una classe di caratteri contenente solo il carattere '['. – interjay

+0

Ah si. Hai ragione. Grazie per la spiegazione. – unutbu

5

glob utilizza fnmatch sotto il cofano. È possibile utilizzare direttamente:

import fnmatch, os 

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

o utilizzando (non pubblica) glob.glob1() (è presente almeno in Python 2.3 + tra cui Python 3):

import glob 

print glob.glob1("/Users/smcho/Desktop/bracket/[10,20]", '*.txt') 

Ecco l'attuazione di 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

È possibile utilizzare path.replace('[', '[[]') per avere percorsi di input arbitrari gestiti correttamente da glob.

3

In Python 3.4 è possibile utilizzare glob.escape.