Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将字典列表作为csv直接写入S3_Python_Amazon Web Services_Csv_Amazon S3 - Fatal编程技术网

Python 将字典列表作为csv直接写入S3

Python 将字典列表作为csv直接写入S3,python,amazon-web-services,csv,amazon-s3,Python,Amazon Web Services,Csv,Amazon S3,我有一个字典列表,比如 temp_dict=[{'id':'1','name':'john'},{'id':'2','name':'jake'},{'id':'3','name':'jacob'}] 有没有一种方法可以让我直接将这个字典作为csv文件(以管道分隔)写入S3。我不想在此列表中在本地创建csv文件,然后将其复制到S3。这可以解决您的问题 将内存中的对象转换为二进制流,并使用boto3传递到s3 我认为这会有帮助: import csv class Pipe: value =

我有一个字典列表,比如
temp_dict=[{'id':'1','name':'john'},{'id':'2','name':'jake'},{'id':'3','name':'jacob'}]

有没有一种方法可以让我直接将这个字典作为csv文件(以管道分隔)写入S3。我不想在此列表中在本地创建csv文件,然后将其复制到S3。

这可以解决您的问题

将内存中的对象转换为二进制流,并使用boto3传递到s3


我认为这会有帮助:

import csv

class Pipe:
    value = ""
    def write(self, text):
        self.value = self.value + text

temp_dict = [{'id':'1', 'name':'john'},{'id':'2', 'name':'jake'},{'id':'3', 'name':'jacob'}]

pipe = Pipe()
writer = csv.DictWriter(pipe, temp_dict[0].keys())
for entry in temp_dict:
    writer.writerow(entry)

print(pipe.value)

基本上,我们在写模式下编写一个类来模拟文件对象,然后创建一个实例,并将其传递给
DictWriter
。最后,我们从
pipe.value

中获取csv文本。这里有一个解决方案,它稍微优雅一些,速度非常快,特别是对于大型词典列表

import io
import csv

data = [{"param1": 1, "param2": 2}, {"param1": 1, "param2": 3}]

stream = io.StringIO()
headers = list(data[0].keys())
writer = csv.DictWriter(stream, fieldnames=headers)
writer.writeheader()
writer.writerows(data)

csv_string_object = stream.getvalue()
使用这个表示CSV文件内容的字符串对象,您可以通过boto3以您喜欢的任何方式直接将其插入S3

session = boto3.session.Session(profile_name=<your_profile_name>)
resource = session.resource("s3")
resource.Object(<s3_bucket>, <s3_key>).put(Body=csv_string_object)
session=boto3.session.session(profile\u name=)
资源=会话资源(“s3”)
resource.Object(,).put(Body=csv\u string\u Object)

请注意,您的CSV文件现在已加载到内存中,可能会因大量数据而崩溃。

Hi Gauri,请与我们分享一些示例代码。我不知道如何将字典列表转换为csv流。到底是什么问题?你试过什么,做过什么研究吗?堆栈溢出不是免费的代码编写服务。见:。
session = boto3.session.Session(profile_name=<your_profile_name>)
resource = session.resource("s3")
resource.Object(<s3_bucket>, <s3_key>).put(Body=csv_string_object)