glob和括号字符('[]')
/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[]]"
[[]
是一个只包含字符[
的字符类,而[]]
是一个只包含字符]
的字符类(闭合括号可以通过放在字符类的第一个位置来包含)。
另外,由于在字符串中方括号没有被转义,所以你的代码会同时寻找反斜杠和方括号。