簡體   English   中英

將字典列表作為 csv 直接寫入 S3

[英]Writing a list of dictionaries directly to S3 as csv

我有一個字典列表,如temp_dict = [{'id':'1', 'name':'john'},{'id':'2', 'name':'jake'},{'id':'3', 'name':'jacob'}]有沒有一種方法可以直接將此字典作為 csv 文件(管道分隔)寫入 S3。 我不想從此列表在本地創建 csv 文件,然后將其復制到 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)
1,john
2,jake
3,jacob

基本上,我們在寫模式下編寫一個類來模仿文件對象,然后我們創建一個實例,並將其傳遞給DictWriter 最后,我們從pipe.value獲取 csv 文本。

這可以解決您的問題。

將您的內存對象轉換為二進制流並使用 boto3 傳遞到 s3。

如何使用 boto3 將文件或數據寫入 S3 對象

這是一個更優雅且速度非常快的解決方案,特別是對於大量字典。

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 文件現在已加載到內存中,並且可能會因大量數據而崩潰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM