Python glob和括号字符('[]')

时间:2010-04-07 19:00:10

标签: python glob

/ Users / smcho / Desktop / bracket / [10,20]目录有“abc.txt”,但是当我运行这个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不能处理括号字母或其他字母吗?
  • 有什么方法可以解决这个问题吗?

4 个答案:

答案 0 :(得分:18)

glob中的括号用于字符类(例如[a-z]将匹配小写字母)。您可以将每个括号放在一个字符类中以强制它们匹配:

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

[[]是一个只包含字符[的字符类,[]]是一个只包含字符]的字符类(结束括号可以放在一个把它放在第一个位置的字符类。)

此外,由于括号不会在字符串文字中转义,因此您的代码将查找反斜杠和括号。

答案 1 :(得分: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 :(得分:4)

在Python 3.4中,您可以使用glob.escape

答案 3 :(得分:3)

您可以使用path.replace('[', '[[]')正确处理glob的任意输入路径。