/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/bracket/[10,20]" pathName = os.path.join(path1, "*.txt") print glob.glob(pathName)
It returns an empty list.
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
] 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.
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
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 != '.': names = filter(lambda x: x != '.', names) return fnmatch.filter(names, pattern)
You could use
path.replace('[', '[') to have arbitrary input paths handled by
In Python 3.4 you can use