2

我有一个可以从中检索文件的 API。我使用urllib3in来执行此操作python

例如

url = "https://example.com/api/files/13"
r = http.request('GET', url, headers=headers)

其中 headers dict 包含用于身份验证的信息。

解码响应中的所有数据时,得到与我预期相同的结果。我通过浏览器的网络信息终端的响应验证了这一点:

load = json.loads(r.data.decode('utf-8'))
data = load['data']

data在这个阶段是一个包含字符和数字的长字符串,并且看起来,取决于文件,类似于dG0seHJheSxtZWRQaG90b24uU04yMDE2LUlSMDA3LkltUmlfRGV0X3BvcyxtZWRQaG90b24uU04yMDE2LUlSMDA3LkltUmlfRGV0X3ZlbCxtZWRQaG90b24uU04yMDE2LUlSMDA3LkltUmlfRGV0X2FjYyxtZWRQaG90b24uU04yMDE2LUlSMDA3LkltUmlfUm5nX3BvcyxtZWRQaG90b24uU04yMDE2LUlSMDA3LkltUmlfUm5nX3ZlbCxtZWRQaG90b...,在点之后继续。但它只是一个 csv 文件。

我现在面临的唯一挑战是将数据存储到光盘上。到目前为止我尝试的是:

with open(dst_file, 'wb') as out_file:
    out_file.write(data)

而不是outfile.write(...)我也尝试过shutil.copyfileobj(r, out_file),但也不起作用。

我想这取决于我所拥有的数据的表示形式。我想把它作为一个字符串并不是真的有用。但是怎么保存呢?

编辑: 可能需要注意的一件事:api url 不包含文件,因此调用将被重定向。我用网络上的另一个文件进行了尝试,在这里我确实在访问时立即获得了所需的数据>> r.data

4

2 回答 2

0

如果您正在使用请求,您应该能够添加一个可以解决问题的allow_redirects=True标志。在 urllib3 中,您可以通过设置重试次数来操纵此行为。我不熟悉这个,所以我会留下一个链接。

只需 CTRL+F 即可重定向!

https://urllib3.readthedocs.io/en/latest/user-guide.html

于 2019-10-16T13:15:43.873 回答
0

问题有点不同。我不知道数据是如何编码的,甚至是编码的(老实说,没想到会编码一个小的 csv)。

在这种情况下,使用检索到的数据并使用 base64 对其进行解码解决了该问题。

import base64
...
data_str = base64.b64decode(load["data"])
...
于 2019-10-31T10:22:47.847 回答