Как программно переименовать файл, когда он загружается автоматически в Python-Selenium?

У меня есть скрипт Selenium (Chrome), который переходит по URL-адресу и последовательно загружает кучу файлов. Но все имена — тарабарщина, и поэтому ни Selenium, ни Chrome не контролируют имя загружаемого файла. Итак, что я хочу сделать, это посмотреть каталог загрузки на предмет любых новых файлов, которые создаются, а затем переименовать их при создании с именем по своему выбору.

Как мне это сделать? Я слышал, что watchdog — хороший пакет для создания и регистрации EventListener. Но тогда как мне динамически передать обработчику определенное имя при запуске события on_created? Является ли watchdog правильным решением или есть какое-то другое решение, которое может сработать?

ПРИМЕЧАНИЕ. Я попытался получить все файлы в каталоге с помощью glob, а затем обновить имя последнего файла, сравнив время создания, но это приводит к логической ошибке, поскольку имена файлов смешиваются в случае, если новый файл не загружен к моменту выполнения этого метода. Я прикрепил код ниже для этого метода.

def __rename_downloaded_file(self, filename: str):
    """Rename the latest download file to the given name"""
    # TODO create a listener instead of the while loop
    while True:
        # keep looping in case there are no file in directory.
        list_of_files = glob.glob(f"{self.download_path}\\*.pdf")
        if len(list_of_files) > 0:
            break
    latest_file = max(list_of_files, key=os.path.getctime)
    print(latest_file)
    head, _ = os.path.split(latest_file)
    new_filename = os.path.join(head, filename+'.pdf')
    print(new_filename)
    os.rename(latest_file, new_filename)

person Ayush Nair    schedule 01.05.2020    source источник
comment
Как вы скачиваете файлы? Рассмотрите возможность использования wget, который имеет возможность именования выходных файлов.   -  person agastya    schedule 01.05.2020
comment
@agastya Я загружаю файлы автоматически, нажимая кнопки в скрипте селена. У меня нет возможности использовать wget.   -  person Ayush Nair    schedule 02.05.2020
comment
Можете ли вы поделиться кодом, используемым для запуска селена и загрузки файлов?   -  person agastya    schedule 02.05.2020
comment
@agastya я не могу. Это выдаст веб-сайт, который я очищаю, и он является собственностью. Но я могу сказать вам, что это все через нажатия кнопок. Таким образом, 1_. Появляется индикатор выполнения (подготовка файла к экспорту), и я жду завершения, а затем нажимаю ссылку для загрузки, и PDF-файл появляется в разделе загрузки.   -  person Ayush Nair    schedule 04.05.2020
comment
Когда вы дойдете до последнего шага (появится ссылка для скачивания), используйте selenium, чтобы получить путь к ссылке (это будет ссылка ‹a› [href]). Затем используйте для этого wget. Это должно сработать, и вы сможете переименовать загрузку.   -  person agastya    schedule 04.05.2020
comment
Я пробовал это. Получение 403 Forbidden. Пробовал с библиотекой requests тоже не получилось. Не принимает стандартные сертификаты ЦС   -  person Ayush Nair    schedule 06.05.2020


Ответы (2)


Вы пытались дождаться загрузки файла. Если вы сделали так, вы можете просто получить последний файл по max (list_of_files, key = os.path.getctime) и изменить имя последнего файла. После изменения файла вы могли начать загрузку других файлов

person Raghavendra Phayde    schedule 01.05.2020
comment
Я могу подождать, но как долго? Зависит от скорости и стабильности интернет-соединения, и да, я буду размещать это на сервере в какой-то момент в будущем, и тогда у меня будет стабильная сеть, но до тех пор что мне делать? Некоторые файлы большие, а другие маленькие. Так что не может быть жестко запрограммированного времени ожидания. - person Ayush Nair; 02.05.2020
comment
Проверьте это Подождите загрузить для завершения в потоке selenium python - person Raghavendra Phayde; 04.05.2020
comment
благодарю вас. Это может сработать. Я попробую и дам вам знать. - person Ayush Nair; 04.05.2020

Ответ здесь.

@Raghavendra Phayde, спасибо, что поместили меня в эту тему.

Список загрузок, которые вы получаете, отсортирован по метке времени последней загрузки. Затем вы можете переименовать каждый файл с помощью приведенного ниже кода.

for old_filename, new_filename in zip(downloaded_file_names, rename_list):
    head, _ = os.path.split(old_filename)
    new_file_name_path = os.path.join(head, new_filename + '.pdf')
    # print(old_filename)
    # print(new_file_name_path)
    # print('\n')
    os.rename(old_filename, new_file_name_path)
person Ayush Nair    schedule 06.05.2020