Как читать файл csv из ведра s3 с помощью Pandas в Python
Я пытаюсь прочитать CSV-файл, расположенный в ведро AWS S3, в память в виде кадра данных pandas, используя следующий код:
import pandas as pd import boto data = pd.read_csv('s3:/example_bucket.s3-website-ap-southeast-2.amazonaws.com/data_1.csv')
Чтобы предоставить полный доступ, я установил политику ведра в ведро S3 следующим образом:
{ "Version": "2012-10-17", "Id": "statement1", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::example_bucket" } ]
}
К сожалению, я все еще получаю следующую ошибку в python:
boto.exception.S3ResponseError: S3ResponseError: 405 Method Not Allowed
Интересно, сможет ли кто-нибудь объяснить, как правильно установить разрешения в AWS S3 или настроить pandas правильно, чтобы импортировать файл. Благодаря!
- Открытый объект S3 в виде строки с Boto3
- Как закрыть соединение Boto S3?
- Как загрузить файл в каталог в ведро S3 с помощью boto
- Как расшифровать шифрование на стороне клиента AWS Ruby на Python
- Unzip my_file.zip вытащил из s3 с помощью boto
В конце концов я понял, что вам также нужно установить разрешения для каждого отдельного объекта в ведре, чтобы извлечь его, используя следующий код:
from boto.s3.key import Key k = Key(bucket) k.key = 'data_1.csv' k.set_canned_acl('public-read')
И мне также пришлось изменить адрес ведра в команде pd.read_csv следующим образом:
data = pd.read_csv('https://s3-ap-southeast-2.amazonaws.com/example_bucket/data_1.csv')
Вам не нужны панды .. вы можете просто использовать стандартную библиотеку csv python
def read_file(bucket_name,region, remote_file_name, aws_access_key_id, aws_secret_access_key): # reads a csv from AWS # first you stablish connection with your passwords and region id conn = boto.s3.connect_to_region( region, aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key) # next you obtain the key of the csv you want to read # you will need the bucket name and the csv file name bucket = conn.get_bucket(bucket_name, validate=False) key = Key(bucket) key.key = remote_file_name data = key.get_contents_as_string() key.close() # you store it into a string, therefore you will need to split it # usually the split characters are '\r\n' if not just read the file normally # and find out what they are reader = csv.reader(data.split('\r\n')) data = [] header = next(reader) for row in reader: data.append(row) return data
надеюсь, что он решил вашу проблему, удачи! 🙂
Использование панд 0.20.3
import os import boto3 import pandas as pd import sys if sys.version_info[0] < 3: from StringIO import StringIO # Python 2.x else: from io import StringIO # Python 3.x # get your credentials from environment variables aws_id = os.environ['AWS_ID'] aws_secret = os.environ['AWS_SECRET'] client = boto3.client('s3', aws_access_key_id=aws_id, aws_secret_access_key=aws_secret) bucket_name = 'my_bucket' object_key = 'my_file.csv' csv_obj = client.get_object(Bucket=bucket_name, Key=object_key) body = csv_obj['Body'] csv_string = body.read().decode('utf-8') df = pd.read_csv(StringIO(csv_string))
- Предотвратите ОЗУ от подкачки для области подкачки (mlock)
- Почему PDB, похоже, не поддерживает help () для всех объектов, таких как обычный интерпретатор Python?
- Чтение данных с S3 с использованием Lambda
- AWS EMR импортирует внешнюю библиотеку из S3
- Как загрузить данные в Amazon Redshift через Python Boto3?
- Boto + Python + AWS S3: Как получить атрибут last_modified определенного файла?
- Boto3 для загрузки всех файлов из ведра S3
- Отправить большие файлы в GAE Blobstore через API (из S3)
- Более быстрый способ сделать иерархию папок S3 «чем анализ имен файлов?
- Разрешения Lambda и S3, если вы хотите создать файл
- Запись потока байтов в s3 с использованием python