/ 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)
它返回一个空列表。
答案 0 :(得分:18)
glob
中的括号用于字符类(例如[a-z]
将匹配小写字母)。您可以将每个括号放在一个字符类中以强制它们匹配:
path1 = "/Users/smcho/Desktop/bracket/[[]10,20[]]"
[[]
是一个只包含字符[
的字符类,[]]
是一个只包含字符]
的字符类(结束括号可以放在一个把它放在第一个位置的字符类。)
此外,由于括号不会在字符串文字中转义,因此您的代码将查找反斜杠和括号。
答案 1 :(得分:5)
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)
答案 2 :(得分:4)
在Python 3.4中,您可以使用glob.escape
。
答案 3 :(得分:3)
您可以使用path.replace('[', '[[]')
正确处理glob
的任意输入路径。