【问题标题】:glob and bracket characters ('[]')全局和括号字符('[]')
【发布时间】:2011-02-05 09:51:55
【问题描述】:

/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 不能处理括号字母或其他字符吗?
  • 有没有办法解决这个问题?

【问题讨论】:

    标签: python glob


    【解决方案1】:

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

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

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

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

    【讨论】:

    • @Roger:谢谢,我已经修好了。
    • @~unutbu: 不,[[10,20]] 将查找[102, 中的一个字符,然后是]。我不仅将括号加倍,还创建了一个字符类:[[] 是一个仅包含字符 [ 的字符类。
    • 执行此更改的快速正则表达式:ptn = re.sub('([\[\]])','[\\1]',ptn)
    【解决方案2】:

    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)
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这样做 glob.glob(glob.escape(pathName))?!我仍然得到一个空列表
        • 那么您的pathName 是错误的。如果它是相对路径,请仔细检查您的工作目录是否是您认为的目录:os.getcwd()
        • 似乎转义无法正常工作。 glob.escape('[P]ISBN_4\Image\0001') 出于某种原因产生“[[]P]ISBN_4\Image1”...
        • 正确。如果你想使用反斜杠,你需要转义它们或使用原始字符串:glob.escape(r'[P]ISBN_4\Image\0001'),它会产生[[]P]ISBN_4\Image\0001
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-08
        • 2017-09-28
        • 1970-01-01
        • 2012-01-28
        • 1970-01-01
        相关资源
        最近更新 更多