[英]request.put() but it request using GET by PUT on my python
[英]Uploading a csv type data using python request.put without reading from a saved csv file?
我有一个 api 端点,我正在使用 python 上传数据。 端点接受
putHeaders = {
'Authorization': user,
'Content-Type': 'application/octet-stream' }
我当前的代码是这样做的
. 将字典另存为 csv 文件
.将 csv 编码为 utf8
dataFile = open(fileData['name'], 'r').read()).encode('utf-8')
.上传文件到api端点
fileUpload = requests.put(url,
headers=putHeaders,
data=(dataFile))
我想要实现的是
加载数据而不保存
到目前为止我试过
使用将我的字典转换为字节
数据 = json.dumps(payload).encode('utf-8')
并加载到 api 端点。 这有效,但 api 端点的输出不正确。
题
有谁知道如何在不实际保存文件的情况下上传 csv 类型的数据?
我没有意识到你的输入是一本字典,你提到字典被保存为一个文件。 我假设您代码中的字典查找引用了一个文件。 如果您想从 dict 转换为类似 CSV 文件的对象,则需要做更多的工作。
根据您问题中的 I/O,您的输入字典似乎具有以下结构:
file_data = {"name": {"Col1": 1, "Col2": 2}}
import csv
import io
import requests
session = requests.Session()
session.headers.update(
{"Authorization": user, "Content-Type": "application/octet-stream"}
)
file_data = {"name": {"Col1": 1, "Col2": 2}}
with io.StringIO() as f:
name = file_data["name"]
writer = csv.DictWriter(f, fieldnames=name)
writer.writeheader()
writer.writerows([name]) # `data` is dict but DictWriter expects list of dicts
response = session.put(url, data=f)
您可能希望使用在请求标头中传递的正确 MIME 类型进行测试。 虽然端点可能不在乎,但最好为数据使用正确的类型。 CSV 应该是text/csv
。 Python 还提供了一个MIME 类型模块:
>>> import mimetypes
>>>
>>> mimetypes.types_map[".csv"]
'text/csv'
只需以字节模式打开文件,而不必担心编码或读入内存。
此外,使用上下文管理器来处理文件而不是分配给变量,并将您的标头传递给Session
对象,这样您就不必在请求调用中重复传递标头数据。
关于 PUT 方法的文档:
https://requests.readthedocs.io/en/master/api/#requests.put
数据 -(可选)字典、元组列表、字节或在请求正文中发送的类似文件的对象。
import requests
session = requests.Session()
session.headers.update(
{"Authorization": user, "Content-Type": "application/octet-stream"}
)
with open(file_data["name"], "rb") as f:
response = session.put(url, data=f)
注意:我修改了您的代码以更紧密地遵循 python 样式指南。
编辑:在将 dict 写入 csv 时,使用io.StringIO()
作为类似文件的对象。 然后调用get_value()
并将其作为数据参数传递给requests.put()
。
有关更多详细信息,请参阅此问题: How do I write data into CSV format as string (not file)? .
旧答案:
如果你的字典是这样的:
my_dict = {'col1': 1, 'col2': 2}
然后您可以将其转换为 csv 格式,如下所示:
csv_data = ','.join(list(my_dict.keys()))
csv_data += ','.join(list(my_dict.values()))
csv_data = csv_data.encode('utf8')
然后使用data=csv_data
调用requests.put()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.