2010-04-07 149 views
13

/用户/ smcho /桌面/托架/ [10,20]目录中有 “的abc.txt”,但是当运行此Python代码Python的水珠和括号字符( '[]')

import glob 
import os.path 

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

它返回一个空列表。

  • 不能Python的glob处理括号字母或其他?
  • 有什么办法可以解决这个问题吗?

回答

14

glob中的括号用于字符类(例如,[a-z]将匹配小写字母)。你可以把每个托架在字符类迫使他们被匹配:

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

[[]是仅包含字符[字符类,和[]]是仅包含字符]字符类(右括号可以是放置在一个角色类中,将其放在第一个位置)。

此外,由于括号不会在字符串文字中转义,所以您的代码将寻找反斜杠以及括号。

+0

@Roger:谢谢,我修好了。 – interjay 2010-04-07 19:17:33

+2

@〜unutbu:不,'[[10,20]]'会在'[102,'后面跟着']'查找其中的一个字符。我并没有将括号加倍,而是创建了一个字符类:'[[]'是只包含字符'['的字符类。 – interjay 2010-04-07 19:19:50

+0

啊是的。你是对的。感谢您的解释。 – unutbu 2010-04-07 19:22:22

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任意输入路径。