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

2024-04-30 06:02:02 发布

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

我有一个字典列表,比如 temp_dict = [{'id':'1', 'name':'john'},{'id':'2', 'name':'jake'},{'id':'3', 'name':'jacob'}] 有没有一种方法可以让我直接将这个字典作为csv文件(以管道分隔)写入S3。我不想在此列表中在本地计算机上创建csv文件,然后将其复制到S3


Tags: 文件csv方法nameid列表字典管道
3条回答

我认为这会有帮助:

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)
1,john
2,jake
3,jacob

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

这可以解决你的问题

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

How to write a file or data to an S3 object using boto3

这是一个更加优雅和快速的解决方案,特别是对于大字典列表

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)

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

相关问题 更多 >