Чтение нескольких CSV-файлов из S3 Bucket с Boto3 - PullRequest
0 голосов
/ 17 октября 2018

Мне нужно прочитать несколько CSV-файлов из корзины S3 с помощью boto3 в python и, наконец, объединить эти файлы в один кадр данных в пандах.

Я могу прочитать один файл из следующего скрипта на 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

Кроме того, как передать список выбранных 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?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

API boto3 не поддерживает чтение нескольких объектов одновременно.Что вы можете сделать, это получить все объекты с указанным префиксом и загрузить каждый из возвращаемых объектов с помощью цикла.Для этого вы можете использовать метод 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)

Затем вы можете итеративно применять эту функцию к каждому префиксу и объединять результаты в конце.

0 голосов
/ 17 октября 2018

Можете ли вы сделать это так, используя «фильтр» вместо «все»:

for obj in bucket.objects.filter(Prefix='files/splittedfiles/'):
    key = obj.key
    body = obj.get()['Body'].read()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...