我需要使用python中的boto3从S3存储桶中读取多个csv文件,最后将这些文件合并到熊猫中的单个数据帧中。
我能够从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
文件,并将其组合到大熊猫中的单个数据帧中
此外,我如何将所选Codes
的列表作为列表传递,以便它仅读取那些文件夹。例如
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 :(得分:4)
boto3
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)
然后,您可以将该函数迭代地应用于每个前缀,并最终组合结果。
答案 1 :(得分:2)
修改答案1以克服错误DataFrame constructor not properly called!
代码:
import boto3
import pandas as pd
import io
s3 = boto3.resource('s3')
bucket = s3.Bucket('bucket_name')
prefix_objs = bucket.objects.filter(Prefix="folder_path/prefix")
prefix_df = []
for obj in prefix_objs:
key = obj.key
body = obj.get()['Body'].read()
temp = pd.read_csv(io.BytesIO(body), encoding='utf8')
prefix_df.append(temp)
答案 2 :(得分:0)
您可以使用“过滤器”代替“全部”吗?
for obj in bucket.objects.filter(Prefix='files/splittedfiles/'):
key = obj.key
body = obj.get()['Body'].read()