В настоящее время я разрабатываю сценарий 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
, работают должным образом, и проблему можно считать решенной.