Призывает получить файл.csv из API

Мне нужно получить несколько файлов.csv из SharePoint.

Если я сделаю этот запрос через почтальона

https://mycompany.sharepoint.com/teams/a/g/_api/web/GetFolderByServerRelativeUrl('Data%20Sources\')/Files('sharepoint_test.csv')/$value

С заголовками

Authorization: Bearer eyJ...
Accept: application/json;odata=verbose

Я получаю содержимое "test_sharepoint.csv":

column a,column b,column c
32,523,88
46,34,659
25,767,78

Мне нужно загружать несколько файлов одновременно, и SharePoint, похоже, не предоставляет для этого конечную точку. Таким образом, используя python и grequests, я получаю ответ, но не двоичные данные:

>>> base_url = "https://mycompany.sharepoint.com/teams/a/g/_api/web/GetFolderByServerRelativeUrl('Data%20Sources\')/"
>>> url_1 = "Files('sharepoint_test.csv')/$value"
>>> url_2 = "Files('sharepoint_test_2.csv')/$value"
>>> allurls = [base_url + url_1, base_url + url_2]
>>> headers = {"Authorization": authtoken, "Content-Type": "application/json;odata=verbose", "Accept": "application/json;odata=verbose"}
>>> rs = (grequests.get(u, headers=headers, stream=True) for u in allurls)
>>> s = grequests.map(rs)
>>> s

[<Response [200]>, <Response [200]>]

>>> data = open(s[0], "rb").read()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: expected str, bytes or os.PathLike object, not Response

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

1 ответ

grequests.get, лайк requests.get, возвращает Response объект.

Самый первый пример показывает, как использовать этот объект:

>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=utf8'
>>> r.encoding
'utf-8'
>>> r.text
u'{"type":"User"...'
>>> r.json()
{u'private_gists': 419, u'total_private_repos': 77, ...}

Раздел Binary Response Content говорит:

Вы также можете получить доступ к телу ответа в виде байтов для нетекстовых запросов:

>>> r.content
b'[{"repository":{"open_issues":0,"url":"https://github.com/...

Итак, что вы ищете:

>>> data = open(s[0].content, "rb").read()

Хотя я не уверен, что хорошего вы ожидаете от этого (действительно ли содержимое ответа HTTP будет путем к файлу в вашем текущем рабочем каталоге или локальной файловой системе, закодированном в кодировке вашей файловой системы по умолчанию?), Это то, что вы попросил о.

Также стоит отметить, что первое, что говорит документация для GRequests, на которую вы ссылаетесь:

Примечание: вы, вероятно, должны использовать вместо этого запросы-потоки или запросы-фьючерсы.

В настоящее время GRequests практически не поддерживается, и, вероятно, будет порвать с Requests 3.0, в то время как более новые альтернативы являются одними из основных движущих сил в редизайне 3.0.

Другие вопросы по тегам