Символы шара Python и скобки ('[]')
/Пользователи/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 обрабатывать буквы скобок или другие?
- Есть ли способ решить эту проблему?
Ответы
Ответ 1
Скобки в glob
используются для классов символов (например, [a-z]
будет соответствовать строчным буквам). Вы можете поместить каждую скобку в класс символов, чтобы они были сопоставлены:
path1 = "/Users/smcho/Desktop/bracket/[[]10,20[]]"
[[]
- это класс символов, содержащий только символ [
, а []]
- это класс символов, содержащий только символ ]
(закрывающая скобка может быть помещена в класс символов, помещая ее в первый положение).
Кроме того, поскольку скобки не экранируются в строковых литералах, ваш код будет искать обратную косую черту, а также скобки.
Ответ 2
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)
Ответ 3
В Python 3.4 вы можете использовать glob.escape
.
Ответ 4
Вы можете использовать path.replace('[', '[[]')
для правильного управления произвольными путями ввода glob
.