Функция, написанная на Python для вывода списка файлов в определенной папке, без фильтрации нежелательных результатов. - PullRequest
0 голосов
/ 10 июля 2019

Эта функция не фильтрует файлы, которые соответствуют префиксу (~ $) или расширению (eval (не '.xlsm')), и не фильтрует папки.

Все 3 попытки дали одинаковый результат. Я довольно новичок в этом материале Python, поэтому, пожалуйста, дайте мне понять, что я должен делать ...

ПОПЫТКА 1

def list_of_files(folder_path, prefix_to_filter_out, extension_to_filter_out):
    ...
        result = dict([(file, None) for file in os.listdir(folder_path)
                       if os.path.isdir(file) is False and
                       file.startswith(prefix_to_filter_out) is False and
                       file.endswith(extension_to_filter_out) is False])
    ...
    return result

ПОПЫТКА 2

def list_of_files(folder_path, prefix_to_filter_out, extension_to_filter_out):
    ...
        result = dict([(file, None) for file in os.listdir(folder_path)
                       if not(os.path.isdir(file)) and
                       not(file.startswith(prefix_to_filter_out)) and
                       not(file.endswith(extension_to_filter_out))])
    ...
    return result

ПОПЫТКА 3

def list_of_files(folder_path, prefix_to_filter_out, extension_to_filter_out):
    ...
        result = dict([(file, None) for file in os.listdir(folder_path)
                       if not(os.path.isdir(file))
                       if not(file.startswith(prefix_to_filter_out))
                       if not(file.endswith(extension_to_filter_out))])
    ...
    return result

Я ожидаю, что это отфильтрует временные файлы на Google Диске, начинающиеся с '~ $', отфильтрует папки и отфильтрует все, кроме книги Excel.
Тем не менее, это включает в себя все, даже папки. Это часть приложения, которое выскакивает окно сообщения каждый раз, когда файл в указанной папке добавляется / удаляется. Это очень быстро раздражает, потому что оно появляется каждый раз, когда кто-то открывает или закрывает файл на Google Диске.

Спасибо за помощь!

ПОПЫТКА 4 ​​

def list_of_files(folder_path, prefix_to_filter_out, extension_to_focus_on):
    # Example:
    # folder_path = '/Google Drive/Box List/New Jobs',
    # prefix_to_filter_out = '~$',
    # extension_to_focus_on = '.xlsm'
    result = {}
    for file in os.listdir(folder_path):
        if os.path.isdir(os.path.join(folder_path, file)) is True:
            continue
        if file.startswith(prefix_to_filter_out):
            continue
        if not file.endswith(extension_to_focus_on):
            continue
        result[file] = None

    return result
    # Expected result:  {
    # 1741A Tegan Lee.xlsm,
    # 1741B Tegan Lee.xlsm,
    # 1741C Tegan Lee.xlsm,
    # 1742A WIZARD RENOVATIONS.xlsm,
    # 1742B WIZARD RENOVATIONS.xlsm}

    # Actual result:    {
    # 1741A Tegan Lee.xlsm,
    # 1741B Tegan Lee.xlsm,
    # 1741C Tegan Lee.xlsm,
    # 1742A WIZARD RENOVATIONS.xlsm,
    # 1742B WIZARD RENOVATIONS.xlsm
    # ~$1742A WIZARD RENOVATIONS.xlsm}

В результате больше нет подпапок, но префикс не фильтруется должным образом. Этот последний файл нежелателен в результате ... Это временный файл, который Google Drive создает при открытии файла. Тем не менее, когда я ввожу префикс вручную так: file.startswith ('~ $'), он работает. Когда я печатаю (prefix_to_filter_out), он выплевывает ~ $, поэтому это не ошибка ввода.

1 Ответ

0 голосов
/ 10 июля 2019

Вам просто не хватает некоторых тонких точек.

Ваша переменная file - это имя файла в folder_path, НЕ в вашем рабочем каталоге.os.path.isdir ищет file извне, не находит его, затем возвращает False.

Пусть os.path.isdir найдет каталог, указав весь путь os.path.join(folder_path, file).

def list_of_files(folder_path, prefix_to_filter_out, extension_to_filter_out):
    result = {}
    for file in os.listdir(folder_path):
        if os.path.isdir(os.path.join(folder_path, file)) is True:
            continue
        if file.startswith(prefix_to_filter_out):
            continue
        if file.endswith(extension_to_filter_out):
            continue
        result[file] = None

    return result    >>> list_of_files("some_directory", "~", ".xlsm") # should work

continue означает «перейти к следующему файлу».

Для чего стоит, многострочные dict вызовы функций - сложный способ разработки.Более простой стиль кодирования позволяет вам включать и тестировать эти фильтры по одному.

Если вы еще не готовы выполнить модульные тесты, просто запустите функцию извне и проверьте результаты для одного фильтра ввремя:

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