Python CSV: 从S3追加数据,重复条目

0 投票
2 回答
40 浏览
提问于 2025-04-13 19:47

顺便说一下,我对Python完全是个新手。我有一个循环,它从S3存储桶中提取一些对象信息,并把这些信息填入一个csv文件。对于每个获取到详细信息的对象,我需要把这些数据填入csv中。我的问题是,csv中出现了重复的条目。我希望在csv中看到的是:

account_id;arn
key1;body1
key2;body2
key3;body3
... (until the loop runs through all objects in that folder)

但我现在得到的是:

account_id;arn
key1;body1
account_id;arn
key1;body1
account_id;arn
key2;body2
account_id;arn
key1;body1
account_id;arn
key2;body2
account_id;arn
key3;body3

而且每次我运行这个脚本时,它都会把旧的数据再加进去,这样问题就越来越严重了。

我现在的代码是:

for objects in my_bucket.objects.filter(Prefix="folderpath"):
    key = objects.key
    body = objects.get()['Body'].read()
    field = ["account_id","arn"]
    data = [
        [key, body]
    ]
    with open("my_file.csv", "a") as f:
    writer = csv.writer(f, delimiter=";", lineterminator="\\n")
    writer.writerow(field)
    writer.writerows(data)

2 个回答

0

在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后把它放到另一个地方。这就像是把书从一个书架搬到另一个书架一样。

有些时候,我们会遇到一些问题,比如数据的格式不对,或者我们想要的数据没有找到。这就像是你在找一本书,但它被放错了地方,或者根本就没有这本书。

为了避免这些问题,我们可以使用一些工具和方法来帮助我们更好地管理和处理这些数据。就像在搬书的时候,我们可以先把书分类,这样在搬的时候就会方便很多。

总之,处理数据就像整理书籍一样,需要耐心和一些技巧,才能让一切变得井井有条。

import csv

# Assuming `my_bucket` and `folderpath` are defined earlier

# Open the CSV file in write mode
with open("my_file.csv", "w", newline="") as f:
    writer = csv.writer(f)

    # Write header row once at beginning of file
    writer.writerow(["account_id", "arn"])

    # Create a list to store content for all rows
    data = []

    # Iterate over objects in the S3 bucket
    for objects in my_bucket.objects.filter(Prefix="folderpath"):
        key = objects.key
        body = objects.get()["Body"].read()

        # Append the row
        data.append([key, body])

    # Write all the data at end in a single I/O operation
    writer.writerows(data)
0

如果你在Python中使用csv模块,事情会简单很多。

首先,你需要定义你的表头,并像下面这样准备你的csv文件:

import csv

with open('names.csv', 'w', newline='') as csvfile:
    fieldnames = ['account_id', 'arn']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writeheader()
    
    for objects in my_bucket.objects.filter(Prefix="folderpath"):
        key = objects.key
        body = objects.get()['Body'].read()
        
        writer.writerow({'account_id': key, 'arn': body})

撰写回答