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

41 投票
4 回答
19611 浏览
提问于 2025-04-15 21:20

/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 个回答

7

glob 这个东西在内部其实是用 fnmatch 来工作的。你也可以直接使用 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)
23

在Python 3.4中,你可以使用 glob.escape 这个功能。

44

glob中,方括号是用来表示字符类的,比如[a-z]可以匹配所有的小写字母。你可以把每个方括号放进字符类里,这样就能强制它们被匹配:

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

[[]是一个只包含字符[的字符类,而[]]是一个只包含字符]的字符类(闭合括号可以通过放在字符类的第一个位置来包含)。

另外,由于在字符串中方括号没有被转义,所以你的代码会同时寻找反斜杠和方括号。

撰写回答