从S3存储桶中使用boto3读取多个csv文件
从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中实现这个?
问题的原因是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/…,但这样做只会将整个字符串设置为列名并留空值。
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存储桶名称。