存储通过 HTTP GET 检索的文件

Store file retrieved by HTTP GET

我有一个 API 我可以从中检索文件。我在 python.

中使用 urllib3 执行此操作

例如

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)

我也尝试了 shutil.copyfileobj(r, out_file) 而不是 outfile.write(...),但也没有用。

我想这取决于我拥有的数据的表示形式。我想把它作为一个字符串并不是很有用。但是如何存储呢?

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

时立即获得了所需的数据

如果您正在使用请求,您应该能够添加一个 allow_redirects=True 标志,这可能会起到作用。在 urllib3 中,您可以通过设置重试次数来操纵此行为。我不太熟悉这个,所以我就给它留下一个 link。

只需 CTRL+F 进行重定向!

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

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

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

import base64
...
data_str = base64.b64decode(load["data"])
...