Как я могу загружать csv-файлы как отдельный фрейм данных из корзины S3 в python?

#python #amazon-web-services #amazon-s3 #boto3

#питон #amazon-веб-сервисы #amazon-s3 #boto3 #python #amazon-web-services

Вопрос:

 s3 = boto3.client('s3')

def get_s3_keys(bucket, prefix):

    """Get a list of keys in an S3 bucket."""
    resp = s3.list_objects_v2(Bucket=bucket, Prefix=prefix)
    for obj in resp['Contents']:
      files = obj['Key']
      print(files)
    return files


filename = get_s3_keys('bucket', 'folder')
print(filename)

  

Я использую описанную выше функцию для получения ключей и вижу 3 CSV-файла. Я хочу, чтобы они были импортированы в отдельные фреймы данных.

Комментарии:

1. Нравится использовать Pandas ?

2. да, используя pandas

Ответ №1:

У меня есть три файла на моем S3: airtravel.csv, cities.csv, tally_cab.csv , которые были взяты отсюда.

Я использую это:

 import boto3
import pandas as pd

my_bucket = "eine-spinne"
s3 = boto3.client("s3")
resp = s3.list_objects_v2(Bucket=my_bucket)

dfs = {}
for file in resp['Contents']:
    key = file['Key']
    if key.endswith(".csv"):
        object_data = s3.get_object(Bucket=my_bucket, Key=key)
        dfs[key] = pd.read_csv(object_data['Body'])

print(type(dfs['airtravel.csv']), "n", dfs['airtravel.csv'].iloc[0])
  

Это создает один dict из трех фреймов данных, в которых файлы S3 являются ключами.

Пример вывода:

 <class 'pandas.core.frame.DataFrame'> 
 Month      JAN
 "1958"    340
 "1959"    360
 "1960"    417
Name: 0, dtype: object
  

Комментарии:

1. Этот ответ предполагает, что мы должны объединить файлы, но мы не должны, а также в корзине есть несколько каталогов. Поэтому я хочу просто импортировать файлы, которые находятся в определенной папке отдельно.

2. Вы не упомянули ничего из этого в своем вопросе. Вы явно говорите, что есть три файла, и вы хотите, чтобы они были в трех фреймах данных. Кроме того, решение ничего не объединяет. Используется Prefix для получения файлов из определенных папок.

3. Если вы уже установили s3fs (pip install s3fs), вы можете прочитать файл непосредственно из пути s3 без какого-либо импорта: data = pd.read_csv('s3:/bucket....csv')