从S3存储桶中使用boto3读取多个csv文件

8 浏览
0 Comments

从S3存储桶中使用boto3读取多个csv文件

我需要用Python中的boto3从S3存储桶中读取多个csv文件,并最终将这些文件合并到pandas的单个数据框中。

我能够从以下Python脚本中读取单个文件:

s3 = boto3.resource('s3')
bucket = s3.Bucket('test-bucket')
for obj in bucket.objects.all():
    key = obj.key
    body = obj.get()['Body'].read()

以下是我的路径:

files/splittedfiles/Code-345678

在Code-345678中,我有多个csv文件,我需要读取并将其合并到pandas的单个数据框中。

另外,我如何将选定的Code作为列表传递给它,以便它只会读取这些文件夹。例如:

files/splittedfiles/Code-345678
files/splittedfiles/Code-345679
files/splittedfiles/Code-345680
files/splittedfiles/Code-345681
files/splittedfiles/Code-345682

从上面的例子中,我只需要读取以下代码下的文件:

345678, 345679, 345682

我该如何在Python中实现这个?

0
0 Comments

问题的原因是 API不支持一次读取多个对象。解决方法是使用filter()方法设置Prefix参数来获取指定前缀的所有对象,并通过循环加载每个返回的对象。以下是对你的代码进行了简单修改的示例,允许你获取以"files/splittedfiles/Code-345678"为前缀的所有对象,并通过循环读取这些对象,将每个文件加载到DataFrame中:

s3 = boto3.resource('s3')
bucket = s3.Bucket('test-bucket')
prefix_objs = bucket.objects.filter(Prefix="files/splittedfiles/Code-345678")
for obj in prefix_objs:
    key = obj.key
    body = obj.get()['Body'].read()

如果你有多个前缀需要处理,你可以将上述代码封装成一个函数,其中前缀作为参数,然后将结果合并在一起。函数可以像这样:

import pandas as pd
def read_prefix_to_df(prefix):
    s3 = boto3.resource('s3')
    bucket = s3.Bucket('test-bucket')
    prefix_objs = bucket.objects.filter(Prefix=prefix)
    prefix_df = []
    for obj in prefix_objs:
        key = obj.key
        body = obj.get()['Body'].read()
        df = pd.DataFrame(body)
        prefix_df.append(df)
    return pd.concat(prefix_df)

然后你可以迭代地将这个函数应用于每个前缀,并在最后将结果合并起来。

另外,可能会出现ValueError: DataFrame constructor not properly called!的错误。解决方法是将body转换为指定的UTF-8编码的字符串,然后再转换为StringIO对象。具体操作可以参考这里的示例:stackoverflow.com/questions/47379476/…,但这样做只会将整个字符串设置为列名并留空值。

0
0 Comments

问题出现的原因是在使用pandas的DataFrame构造函数时出现了错误。解决方法是使用io模块的BytesIO类将S3桶中的CSV文件内容读取为字节流,然后再使用pandas的read_csv函数将字节流转换为DataFrame对象。最后,将每个DataFrame对象添加到一个列表中。

0
0 Comments

Reading multiple csv files from S3 bucket with boto3

问题原因:在读取S3存储桶中的多个csv文件时,使用了错误的方法。

解决方法:使用正确的方法来读取S3存储桶中的多个csv文件。

示例代码:

import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('your_bucket_name')
for obj in bucket.objects.filter(Prefix='files/splittedfiles/'):
    key = obj.key
    body = obj.get()['Body'].read()
    # 在这里可以对读取到的csv文件进行处理
    # ...

以上代码通过使用正确的`filter`方法,实现了从S3存储桶中读取多个csv文件的功能。

注意:在使用以上代码之前,请确保已经安装了`boto3`库,并且替换代码中的`your_bucket_name`为您自己的S3存储桶名称。

0