Загрузка больших файлов .bz2 с библиотекой Python запросов - PullRequest
0 голосов
/ 26 марта 2020

В настоящее время я разрабатываю сценарий Python, который вызывает API REST для загрузки данных, которые становятся доступными каждый день через API. Файлы, которые я пытаюсь загрузить, имеют расширение .txt.bz2`.

В документации API рекомендуется использовать curl для загрузки данных из API. В частности, команда для загрузки рекомендуемых данных:

curl --user Username:Password https://api.endpoint.com/data/path/to/file -o my_filename.txt.bz2

Где, конечно, URL конечной точки данных API здесь просто вымышлен.

Поскольку в документации рекомендуется curl, моя текущая реализация сценария Python использует библиотеку subprocess для вызова curl в Python:

import subprocess

def data_downloader(download_url, file_name, api_username, api_password):
    args = ['curl', '--user', f'{api_username}:{api_password}', f'{download_url}', '-o', f'{file_name}']
    subrpocess.call(args)
    return file_name

С тех пор, как тем не менее, я широко использую библиотеку requests в других частях приложения, которое я разрабатываю, главным образом для отправки запросов к API и обхода файловой системы, подобной структуре API, я пытался реализовать функцию загрузки с помощью этого библиотека также. В частности, я использовал этот другой поток Stackoverflow в качестве эталона моей альтернативной реализации, и две функции, которые я реализовал с помощью библиотеки requests, выглядят так:

import requests
import shutil

def download_file(download_url, file_name, api_username, api_password, chunk_size):
    with requests.get(download_url, auth=(api_username, api_password), stream=True) as r: 
        with open(file_name, 'wb') as f:
            for chunk in r.iter_content(chunk_size=chunk_size):
            f.write(chunk) 
    return file_name

def shutil_download(download_url, file_name, api_username, api_password):
    with requests.get(download_url, auth=(api_username, api_password), stream=True) as r: 
        with open(file_name, 'wb') as f: 
            shutil.copyfileobj(r.raw, file_name)
    return file_name

Хотя, однако, с реализацией subprocess я могу загрузить весь файл без каких-либо проблем, при попытке выполнить загрузку с использованием двух реализаций requests я всегда получаю загруженный файл с размером 1Kb Это явно неверно, поскольку большая часть загружаемых данных составляет> 10 ГБ.

Я подозреваю, что проблема, с которой я сталкиваюсь, связана с форматом данных, которые я пытаюсь загрузить, так как я видел успешные попытки загрузки файлов .zip или .gzip с использованием тех же логик c, которые я использую в двух функциях. Поэтому мне интересно, может ли кто-нибудь иметь объяснение проблемы, с которой я столкнулся, или предоставить рабочее решение проблемы.

ОБНОВЛЕНИЕ

У меня был шанс чтобы обсудить проблему с владельцем API и, по-видимому, после анализа журналов на их стороне, они обнаружили, что на их стороне были некоторые проблемы, которые препятствовали выполнению запроса на go. С моей стороны, код состояния запроса сигнализировал об успешном запросе, однако возвращенные данные не были правильными.

Две функции, использующие библиотеку requests, работают должным образом, и проблему можно считать решенной.

...