Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用boto3从S3存储桶读取多个csv文件_Python_Csv_Amazon S3_Boto3 - Fatal编程技术网

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

Python 使用boto3从S3存储桶读取多个csv文件,python,csv,amazon-s3,boto3,Python,Csv,Amazon S3,Boto3,我需要用python中的boto3从S3 bucket读取多个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/s

我需要用python中的boto3从S3 bucket读取多个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
文件,我必须读取这些文件并将其合并到熊猫中的单个数据帧中

此外,如何将选定的
代码列表作为列表传递,以便它仅读取这些文件夹。e、 g

files/splittedfiles/Code-345678
files/splittedfiles/Code-345679
files/splittedfiles/Code-345680
files/splittedfiles/Code-345681
files/splittedfiles/Code-345682
从上面我只需要阅读以下代码下的文件

345678,345679,345682

我如何在python中实现它?

您可以这样做,使用“过滤器”而不是“全部”:


boto3
API不支持同时读取多个对象。您可以做的是检索具有指定前缀的所有对象,并使用循环加载每个返回的对象。为此,可以使用
filter()
方法,并将
Prefix
参数设置为要加载对象的前缀。下面我对您的代码进行了简单的更改,这将使您获得前缀为“files/splittedfiles/code-345678”的所有对象,您可以通过在这些对象中循环读取这些对象,然后将每个文件加载到数据帧中:

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以克服错误
数据帧构造函数未正确调用

代码:


***ValueError:未正确调用数据帧构造函数答案可能不推荐使用
body
是一个bytes对象,我必须将其转换为utf-8指定的字符串编码,然后转换为一个StringIO对象,如图所示:,但这只是将整个字符串设置为一个带有空值的列名。
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)
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)