Игнорировать регистр в glob () в Linux - PullRequest
32 голосов
/ 16 ноября 2011

Я пишу скрипт, который должен работать с каталогами, которые вручную изменяются пользователями Windows и Linux.Пользователям Windows, как правило, наплевать на регистр при назначении имен файлов.

Есть ли способ справиться с этим на стороне Linux в Python, то есть можно ли получить регистронезависимое, глобальное поведение?

Ответы [ 4 ]

42 голосов
/ 04 июня 2012

Вы можете заменить каждый буквенный символ c на [cC] через

import glob
def insensitive_glob(pattern):
    def either(c):
        return '[%s%s]' % (c.lower(), c.upper()) if c.isalpha() else c
    return glob.glob(''.join(map(either, pattern)))
22 голосов
/ 16 ноября 2011

Используйте регулярные выражения без учета регистра вместо шаблонов глобуса.fnmatch.translate генерирует регулярное выражение из шаблона глоба, поэтому

re.compile(fnmatch.translate(pattern), re.IGNORECASE)

дает вам независимую от регистра версию варианта шаблона глобуса в виде скомпилированного RE.

Keepпомните, что если файловая система размещена на Linux-блоке в Unix-подобной файловой системе, пользователи смогут создавать файлы foo, Foo и FOO в одном каталоге.

6 голосов
/ 31 августа 2012

не рекурсивно

Для извлечения файлов (и только файлов) каталога "path" с использованием "globexpression":

list_path = [i for i in os.listdir(path) if os.path.isfile(os.path.join(path, i))]
result = [os.path.join(path, j) for j in list_path if re.match(fnmatch.translate(globexpression), j, re.IGNORECASE)]

рекурсивно

с помощью walk:

result = []
for root, dirs, files in os.walk(path, topdown=True):
  result += [os.path.join(root, j) for j in files \
             if re.match(fnmatch.translate(globexpression), j, re.IGNORECASE)]

Лучше также скомпилировать регулярное выражение, поэтому вместо

re.match(fnmatch.translate(globexpression)

сделайте (до цикла):

reg_expr = re.compile(fnmatch.translate(globexpression), re.IGNORECASE)

и затем заменитев цикле:

  result += [os.path.join(root, j) for j in files if re.match(reg_expr, j)]
1 голос
/ 16 марта 2017

В зависимости от вашего случая вы можете использовать .lower() как для шаблона файла, так и для результатов из списка папок, и только затем сравнивать шаблон с именем файла

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