1 Вопрос: Чтение строк файла через HTTP по требованию

вопрос создан в Thu, May 2, 2019 12:00 AM

Что мне нужно сделать, это прочитать файл по HTTP порциями (итерировать по строкам, чтобы быть точным). Я хочу не прочитать весь файл (или большую его часть), а затем разбить его на строки, а вместо этого прочитать небольшой (< = 8 КБ) фрагмент и затем разбить это на строки. Когда все строки в блоке будут использованы, тогда получите следующий блок.

Я пробовал следующее:

with urllib.request.urlopen(url) as f:
  yield from f

Что не сработало. В Wireshark я вижу, что около 140 КБ из общего числа ~ 220 КБ принимаются только по телефону urlopen(url).

Следующее, что я попробовал, было использовать requests:

with requests.get(url, stream=True) as req:
  yield from req.iter_lines()

Который также читает около 140 КБ, просто позвонив по номеру get(url, stream=True). Согласно документация этого не должно происходить. Кроме этого, я не нашел никакой информации об этом поведении или о том, как его контролировать. Я использую запросы 2.21.0, CPython 3.7.3, в Windows 10.

    
0
1 ответ                              1                         

Согласно документам и документы 2 (и учитывая, что источник фактически работает в чанках) Я думаю, что вы должны использовать iter_content, который принимает параметр chunk_size, который вы должны установить в None:

with requests.get(url, stream=True) as req:
    yield from req.iter_content(chunk_size=None)

Я не пробовал, но кажется, что где-то в вашем коде что-то происходит с req.content до iter_lines, поэтому загружается вся полезная нагрузка.

edit_ добавил пример

    
0
2019-05-02 15: 26: 29Z
  1. Мне известно о iter_content, и я тоже пробовал это. Как я уже упоминал в этом вопросе, данные загружаются еще до того, как я вызову какие-либо методы для объекта req. Мой код определенно не имеет доступа к req.content до вызова iter_lines или чего-либо еще. Я проверил это, позвонив по номеру requests.get в одиночку, без чего-либо еще. И кстати, две ссылки в вашем посте одинаковы.
    2019-05-02 17: 22: 29Z
источник размещен Вот