2010-04-07 3 views
13

/사용자/smcho/데스크탑/브라켓/[10, 20] 디렉토리는 "abc.txt"를 가지고 있지만 나는이 파이썬 코드를 실행하면파이썬 글로브와 브래킷 문자 ('[]')

import glob 
import os.path 

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

빈 목록을 반환합니다.

  • 파이썬의 glob가 대괄호 문자 또는 다른 문자를 처리 할 수 ​​없습니까?
  • 이 문제를 해결할 방법이 있습니까?

답변

14

glob의 대괄호는 문자 클래스에 사용됩니다 (예 : [a-z]은 소문자와 일치 함). 당신은 그들이 일치되고 강제로 문자 클래스의 각 브래킷을 넣을 수 있습니다 :

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

[[]는 문자 [를 포함하는 문자 클래스이며, []]는 문자 ]를 포함하는 문자 클래스 (닫기 괄호가 될 수 있습니다 첫 번째 위치에 두어 문자 클래스에 배치).

또한 대괄호는 문자열 리터럴에서 이스케이프 처리되지 않으므로 코드는 대괄호와 백 슬래시를 찾습니다.

+0

@ 로저 : 고마워, 고쳐 놨어. – interjay

+2

@ ~ unutbu : 아니요,'[[10,20]]'는'[102,'뒤에']'문자를 찾습니다. 나는 괄호를 두 배로 만들지 않고 문자 클래스를 만들었습니다.'[[]'는 문자'['만 포함하는 문자 클래스입니다. – interjay

+0

아 맞습니다. 당신이 올바른지. 설명 해줘서 고마워. – unutbu

5

glob은 후드 아래에서 fnmatch을 사용합니다. 당신은 직접 사용할 수 있습니다

import fnmatch, os 

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

또는 (파이썬 3를 포함하여 2.3 이상이 적어도 파이썬에 존재) glob.glob1()이 (비공개)를 사용하여 : 여기

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으로 올바르게 처리 할 수 ​​있습니다.

3

파이썬 3.4에서는 glob.escape을 사용할 수 있습니다.