Задача про 250 файлов

Чтобы не забывать Python, я решаю задачки по программированию в рамках прохождения курсов на платформе Stepik. Поделюсь своими мыслями по решению одной задачки про 250 файлов :

Имеется набор файлов, каждый из которых, кроме последнего, содержит имя следующего файла.
Первое слово в тексте последнего файла: «We».

Скачайте предложенный файл. В нём содержится ссылка на первый файл из этого набора.

Все файлы располагаются в каталоге по адресу:
https://stepic.org/media/attachments/course67/3.6.3/

Загрузите содержимое последнего файла из набора, как ответ на это задание.

У вас есть неограниченное число попыток.

Время одной попытки: 5 mins

Обработайте индивидуальный набор данных за отведённое время

Вроде бы ничего сложного. Собственно, решение на основе материалов урока родилось за 5 минут. Почитав комментарии, сразу вставил проверку статуса ответа и счётчик обработанных файлов. Как оказалось, нужно было получить в результате 5 строк текста. У меня интернет нестабильный и всё могло быть не просто. Первая версия кода :

import requests

ct = 'https://stepic.org/media/attachments/course67/3.6.3/'
with open('dataset_3378_3.txt', 'r', encoding='utf-8') as file:
    fs = file.readline().strip()
print(fs)
ss = requests.get(fs)
fs = ss.text
n = 1
while True:
    adr = ct + fs
    ss = requests.get(adr)
    print(ss.status_code, n)
    if not ss.text.startswith('We'):
        fs = ss.text
        print(fs)
        n += 1
        continue
    else:
        print(ss.text)
        break

Текст писал и запускал в редакторе Wing 101 8. Программа начинала работать и подвисала вываливаясь по таймауту, выбрасывая соответствующее исключение. А даётся всего 5 минут. Иногда падало всё сразу, иногда после нескольких файлов. Максимум получалось 38 файлов. Индивидуальный набор данных оказался в этот раз неизменным — имя первого файла. Сначала хотел сохранять имена файлов в список и далее в файл, а с перезапуска начинать с последнего, но потом подумал, что проще будет обрабатывать исключение и в том же цикле повторять обращение к тому же файлу до успешного считывания. Последний подход себя оправдал. Итоговый код ниже :

import requests

ct = 'https://stepic.org/media/attachments/course67/3.6.3/'
with open('dataset_3378_3.txt', 'r', encoding='utf-8') as file:
    fs = file.readline().strip()
print(fs)
ss = requests.get(fs)
fs = ss.text
n = 1
while True:
    adr = ct + fs
    try:
        ss = requests.get(adr)
    except Exception:
        print('error Timeout')
        continue
    print(ss.status_code, n)
    if not ss.text.startswith('We'):
        fs = ss.text
        print(fs)
        n += 1
        continue
    else:
        print(ss.text)
        break

Запустил на выполнение и ждал результат больше часа. Таймауты срабатывали часто, на некоторых файлах по нескольку раз. Рекорд — 6 раз. Иногда сбоили несколько файлов подряд по 1-2 раза.

200 95
665641.txt
200 96
120842.txt
error Timeout
error Timeout
error Timeout
error Timeout
error Timeout
error Timeout
200 97
435728.txt
200 98
860507.txt

И вот он долгожданный результат :

843785.txt
200 249
We are the champions, my friends,
And we’ll keep on fighting ’til the end.
We are the champions.
We are the champions.
No time for losers
‘Cause we are the champions of the world.

Оказалось, что в цикле нужно было обработать 249 переходов для 250 файлов.

Для чего 250 файлов? Цикл делать всё равно. Скорость выполнения определяется качеством интернета решателя. Хватило бы и 10 файлов. У меня интернет не очень. Выкидывало исключение по таймауту. Решил только через try except. Программа работала больше часа. Ну и чему учит решение этой задачи?  

Как всегда — борьбе с «мельницами», чему программист отдаёт более 90% времени.

Вперёд Донкихоты !

Обновлено: 08.11.2022 — 17:46

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *