2010-04-07 2 views
13

/Users/smcho/Desktop/кронштейн/[10,20] каталог имеет "abc.txt", но когда я запускаю этот код PythonPython GLOB и скобка символы ('[]')

import glob 
import os.path 

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

Он возвращает пустой список.

  • Нельзя ли манипулятор Python обрабатывать буквы скобок или другие?
  • Есть ли способ решить эту проблему?

ответ

14

Скобки в glob используются для классов символов (например, [a-z] будет соответствовать строчные буквы). Вы можете поместить каждую скобу в классе символов, чтобы заставить их быть согласованы:

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

[[] класс символов, содержащий только символ [ и []] класс символов, содержащий только символ ] (закрывающая скобка может быть помещается в класс символов, помещая его в первую позицию).

Кроме того, поскольку скобки не экранированы в строковых литералах, ваш код будет искать обратную косую черту, а также скобу.

+0

@Roger: Спасибо, я исправил его. – interjay

+2

@ ~ unutbu: Нет, '[[10,20]]' будет искать один из символов в '[102,' follow '] '. Я не просто удвоил скобки, а создал класс символов: '[[]' - это класс символов, содержащий только символ '['. – interjay

+0

Ах да. Ты прав. Спасибо за объяснение. – unutbu

5

glob использует fnmatch под капотом. Вы можете использовать его непосредственно:

import fnmatch, os 

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

Или используя (непубличной) glob.glob1() (она присутствует, по крайней мере в Python 2.3+, включая Python 3):

import glob 

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

Вот реализация 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

Вы можете использовать path.replace('[', '[[]'), чтобы иметь произвольные входные пути, обрабатываемые glob правильно.

Смежные вопросы