使用python request.put上载csv类型数据而不读取保存的csv文件?

2024-10-03 11:19:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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))

我想说的是

加载数据而不保存

到目前为止我试过了

使用将我的字典转换为字节

data=json.dumps(有效负载).encode('utf-8')

并加载到api端点。这可以工作,但api端点中的输出不正确

enter image description here

问题:

有人知道如何在不保存文件的情况下上传csv类型的数据吗


Tags: 文件csv数据apidataapplicationtypecontent
2条回答

编辑:将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()调用

更新的答案

我没有意识到你的输入是一本字典,你提到字典正在保存为文件。我假设代码中的字典查找引用了一个文件。如果您想从dict变成类似CSV文件的对象,需要做更多的工作

根据您问题的I/O,您的输入词典似乎具有以下结构:

file_data = {"name": {"Col1": 1, "Col2": 2}}

鉴于此,我建议使用csvio尝试以下操作:

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 types module

>>> import mimetypes
>>> 
>>> mimetypes.types_map[".csv"]
'text/csv'

原始答案

只需以字节模式打开文件,而不用担心编码或读入内存

此外,使用上下文管理器来处理文件而不是分配给变量,并将头传递给Session对象,这样就不必在请求调用中重复传递头数据

关于PUT方法的文件:

https://requests.readthedocs.io/en/master/api/#requests.put

data – (optional) Dictionary, list of tuples, bytes, or file-like object to send in the body of the Request.

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风格指南

相关问题 更多 >