Проверка на вхождение одной строки в другую

Есть переменная fc которая принимает значения: R:\TEST\TESTXLS.xlsx или R:\TEST\TESTXLS.xls для проверки расширения файла я использую

if 'xlsx' in fc:

при попытке использовать

if 'xlsx' or 'xls' in fc:

скрипт не срабатывает так как надо.

Как нужно написать чтобы правильно срабатывал ?


Ответы (1 шт):

Автор решения: CrazyElf

Тут сразу несколько ошибок. Например, это выражение всегда истинно:

'xlsx' or 'xls' in fc => ('xlsx') or ('xls' in fc) => True or ('xls' in fc) => True

Т.е. правильный код должен быть такой:

if 'xlsx' in fc or 'xls' in fc:
          ^^^^^

Имя файла лучше выделять из полного пути, чтобы не было ложных срабатываний, если в пути попадётся такая же строка, делать это можно с помощью os.path.split, и после этого уже проверять только имя файла. Ну и ещё нужно переводить в нижний регистр перед сравнением с помощью функции lower(), потому что имя файла может быть в любом регистре.

Но лучше всего выделять сразу расширение файла, для этого тоже есть специальная функция os.path.splitext.

Пример кода:

import os

paths = ["R:\TEST\TESTXLS.xlsx", "R:\TEST\TESTXLS.XLS", "R:\TEST.xlsx\TESTXLS.bmp"]
extensions = [".xls", ".xlsx"]
for filename in paths:
    head, ext = os.path.splitext(filename)
    if ext.lower() in extensions:
        print(filename)

Вывод:

R:\TEST\TESTXLS.xlsx
R:\TEST\TESTXLS.XLS
→ Ссылка