0

我需要从 SharePoint 获取多个 .csv 文件。

如果我通过邮递员提出这个请求

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

4

1 回答 1

0

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, ...}

二进制响应内容部分说:

对于非文本请求,您还可以将响应正文作为字节访问:

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

所以,你要找的是:

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

虽然我不确定您希望这样做有什么好处(HTTP 响应内容真的会成为您当前工作目录或本地文件系统中的文件的路径,以您的默认文件系统编码进行编码吗?),这就是您要求。

此外,值得注意的是,您链接到的 GRequests 文档的第一件事是:

注意:您可能应该改用requests-threadsrequests-futures

GRequests 现在几乎没有维护,可能会与 Requests 3.0 中断,而较新的替代品是 3.0 重新设计的主要驱动力之一。

于 2018-04-06T21:20:34.673 回答