Игнорировать регистр в glob() в Linux
Я пишу script, который должен будет работать с каталогами, которые модифицируются вручную пользователями Windows и Linux. Пользователи Windows обычно не интересуются случаем при назначении имен файлов.
Есть ли способ справиться с этим на стороне Linux в Python, то есть я могу получить нечувствительное к регистру поведение в виде глобуса?
Ответы
Ответ 1
Используйте не зависящие от регистров регулярные выражения вместо шаблонов glob. fnmatch.translate
генерирует регулярное выражение из шаблона glob, поэтому
re.compile(fnmatch.translate(pattern), re.IGNORECASE)
дает нечувствительную к регистру версию шаблона glob как скомпилированный RE.
Имейте в виду, что если файловая система размещается в ящике Linux в Unix-подобной файловой системе, пользователи смогут создавать файлы foo
, foo
и foo
в том же каталоге.
Ответ 2
Вы можете заменить каждый алфавитный символ 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)))
Ответ 3
Не рекурсивно
Чтобы получить файлы (и только файлы) каталога "путь" с помощью "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)]
Рекурсивный
с прогулкой:
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)
do (перед циклом):
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)]
Ответ 4
В зависимости от вашего случая вы можете использовать .lower()
для обоих шаблонов файлов и результатов из списка папок и только затем сравнить шаблон с именем файла