存储通过 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 进行重定向!
问题有点不同。我不知道数据是如何编码的,甚至是(老实说,没想到会编码一个小的 csv)。
使用检索到的数据并使用 base64 对其进行解码解决了这种情况下的问题。
import base64
...
data_str = base64.b64decode(load["data"])
...
我有一个 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 进行重定向!
问题有点不同。我不知道数据是如何编码的,甚至是(老实说,没想到会编码一个小的 csv)。
使用检索到的数据并使用 base64 对其进行解码解决了这种情况下的问题。
import base64
...
data_str = base64.b64decode(load["data"])
...