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

3

我有一个字典列表,如下所示: temp_dict = [{'id':'1', 'name':'john'},{'id':'2', 'name':'jake'},{'id':'3', 'name':'jacob'}] 有没有一种方法可以直接将该字典写为CSV文件(以管道分隔符分隔),并保存到S3上。我不想从此列表在本地创建CSV文件,然后再将其复制到S3上。


问题是什么,确切地说?你尝试过什么,做了任何研究吗?Stack Overflow不是一个免费的代码编写服务。请参阅:[tour],[ask],[help/on-topic],https://meta.stackoverflow.com/questions/303812/discourage-screenshots-of-code-and-or-errors。 - AMC
3个回答

5
这里有一个解决方案,它更加优雅,并且在处理大量字典列表时非常快速。
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文件现在已经被加载到内存中,大量的数据可能会导致崩溃。


能详细说明一下吗?我很确定它工作得非常好。 - gabzo

1
我认为这会很有帮助:

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文本。

0

嗨Gauri,你能分享一些示例代码吗?我不确定如何将字典列表转换为CSV流。 - Akshay Jagadale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接