@Mixa

Как прочитать в экселе пути файлов, скачать их и разсортировать по папках?

Идея такова: Есть эксель-файл, в каждой строке которого есть поле с уникальным айди, а дальше иду поля, в каждом из которых прописаны внешние пути файлов.

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

Я аматор в программировании, но подозреваю, что подобную задачу можно решить с помощью каких-то библиотек для Python. Буду рад получить реккомендации таковых или может уже есть полуготовые решения для такого рода задач?
  • Вопрос задан
  • 127 просмотров
Пригласить эксперта
Ответы на вопрос 2
hottabxp
@hottabxp Куратор тега Python
Сначала мы жили бедно, а потом нас обокрали..
Можете excel конвертировать в csv - так будет намного проще. Эта задача решается за 2 минуты.

или может уже есть полуготовые решения для такого рода задач?

Это простая задача, как 2 копейки. Так что вря тли есть какие-то решения. requests вам в помощь.
Ответ написан
Комментировать
@MrSpirit
С помощью openpyxl (можно конечно pandas, там это элементарно делается) читаете ваш Эксель, затем с помощью цикла и requests качаете файлы, если файлов очень много попробуйте написать асинхронный загрузчик, раз в 10 быстрее будет качать (поможет aiohttp и aiofiles). Ну а для создания папок вам пригодится os

Вот так можно забрать весь столбец из Эксель
import pandas as pd
from glob import glob

file = glob('*.xlsx')[0]
table = pd.read_excel(file)
urls_list = table['Название столбца'].to_list()


А вот пример загрузчика, писал я (на идеальную правильность не претендую, со своей задачей справляется и хорошо)
import asyncio
import os
from os.path import join as pth_join

import aiofiles
import aiohttp

DWNLD_FLDR = "Download"


async def download_file(session: aiohttp.ClientSession, link: str, file_name: str):
    async with session.get(link) as resp:
        if resp.status == 200:
            f = await aiofiles.open(pth_join(DWNLD_FLDR, file_name), "wb")
            await f.write(await resp.read())
            await f.close()
        else:
            print(f"Error: {resp.status}")


async def gather_files(files_urls: list[dict]):
    async with aiohttp.ClientSession(headers=HEADERS) as session:
        tasks = []
        for item in files_urls:
            try:
                if os.stat(pth_join(DWNLD_FLDR, item["file_name"])).st_size:
                    continue
            except FileNotFoundError:
                pass
            task = asyncio.create_task(
                download_file(session, item["file_link"], item["file_name"])
            )
            tasks.append(task)
        await asyncio.gather(*tasks)


def main(file_list):
    os.makedirs(DWNLD_FLDR) if not os.path.exists(DWNLD_FLDR) else None
    asyncio.run(gather_files(file_list))

if __name__ == "__main__":
    main([{'file_name': 'test.txt',  'file_link': 'http://file_url'}, ])
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы