36

/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

4 回答 4

34

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

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

[[]是仅包含字符的字符类[,并且[]]是仅包含字符的字符类](右括号可以通过将其放在第一个位置来放置在字符类中)。

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

于 2010-04-07T19:08:06.347 回答
17

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

于 2014-06-01T11:04:01.207 回答
7

globfnmatch在引擎盖下使用。你可以直接使用它:

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)
于 2010-04-07T19:15:25.540 回答
5

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

于 2012-08-16T13:28:31.197 回答