繁体   English   中英

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

[英]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}}

鉴于此,我建议使用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 类型模块

>>> 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM