/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)
Это возвращает пустой список.
Скобки в glob
используются для классов символов (например, [a-z]
будет соответствовать строчным буквам). Вы можете поместить каждую скобку в класс символов, чтобы принудительно сопоставить их:
path1 = "/Users/smcho/Desktop/bracket/[[]10,20[]]"
[[]
- это класс символов, содержащий только символ [
, а []]
- это класс символов, содержащий только символ ]
(закрывающая скобка может быть помещена в класс персонажа, поместив его в первую позицию).
Кроме того, поскольку скобки не экранируются в строковых литералах, ваш код будет искать как обратную косую черту, так и скобку.
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)