Python glob and bracket characters ('[]')

前端 未结 4 1802
一向
一向 2020-12-17 08:22

/Users/smcho/Desktop/bracket/[10,20] directory has \"abc.txt\", but when I run this Python code

import glob
import os.path

path1 = \"/Users/smcho/Desktop/br         


        
相关标签:
4条回答
  • 2020-12-17 08:42

    glob uses fnmatch under the hood. You could use it directly:

    import fnmatch, os
    
    names = os.listdir("/Users/smcho/Desktop/bracket/[10,20]")
    print fnmatch.filter(names, '*.txt')
    

    Or using (non-public) glob.glob1() (it is present at least in Python 2.3+ including Python 3):

    import glob
    
    print glob.glob1("/Users/smcho/Desktop/bracket/[10,20]", '*.txt')
    

    Here's the implementation of 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)
    
    0 讨论(0)
  • 2020-12-17 08:45

    The brackets in glob are used for character classes (e.g. [a-z] will match lowercase letters). You can put each bracket in a character class to force them being matched:

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

    [[] is a character class containing only the character [, and []] is a character class containing only the character ] (the closing bracket can be placed in a character class by putting it in the first position).

    Additionally, since brackets aren't escaped in string literals, your code will look for a backslash as well as a bracket.

    0 讨论(0)
  • 2020-12-17 08:48

    You could use path.replace('[', '[[]') to have arbitrary input paths handled by glob correctly.

    0 讨论(0)
  • 2020-12-17 08:53

    In Python 3.4 you can use glob.escape.

    0 讨论(0)
提交回复
热议问题