Символы глобуса и скобки Python ('[]') - PullRequest
21 голосов
/ 07 апреля 2010
В каталоге

/ Users / smcho / Desktop / скобка / [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 не может обрабатывать буквы в скобках или другие?
  • Есть ли способ решить эту проблему?

Ответы [ 4 ]

21 голосов
/ 07 апреля 2010

Скобки в glob используются для классов символов (например, [a-z] будет соответствовать строчным буквам).Вы можете поместить каждую скобку в класс символов, чтобы заставить их сопоставляться:

path1 = "/Users/smcho/Desktop/bracket/[[]10,20[]]"

[[] - это класс символов, содержащий только символ [, а []] - класс символов, содержащий толькосимвол ] (закрывающую скобку можно поместить в класс символов, поместив его в первую позицию).

Кроме того, поскольку в строковых литералах скобки не экранируются, код будет искать обратную косую чертуну как скобка.

6 голосов
/ 01 июня 2014

В Python 3.4 вы можете использовать glob.escape.

5 голосов
/ 07 апреля 2010

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 голосов
/ 16 августа 2012

Вы можете использовать path.replace('[', '[[]'), чтобы произвольные входные пути обрабатывались glob правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...