Рубрики
Без рубрики

Как прочитать файл csv с Amazon S3 в Python

Подробный пост о том, как читать файл CSV с Amazon S3. Tagged с Python, Codenewbie, Beginters, AWS.

Вот сценарий. На Amazon S3 есть огромный файл CSV. Нам нужно написать функцию Python, которая загружает, читает и печатает значение в определенном столбце на стандартном выходе (Stdout).

Simple Googling приведет нас к ответу на это задание в переполнении стека. Код должен выглядеть как что -то вроде следующего:

import codecs
import csv

import boto3


client = boto3.client("s3")

def read_csv_from_s3(bucket_name, key, column):
    data = client.get_object(Bucket=bucket_name, Key=key)

    for row in csv.DictReader(codecs.getreader("utf-8")(data["Body"])):
        print(row[column])

Мы подробно рассмотрим решение выше в этой статье. Представьте, что это как программирование резиновой утки, и в этом случае вы резиновая утка.

Загрузка файла с S3

Давайте начнем. Во -первых, нам нужно выяснить, как загрузить файл с S3 в Python. Официальный AWS SDK для Python известен как Boto3. Согласно документации , мы можем создать Клиент экземпляр для S3, позвонив Boto3.client ("S3") . Тогда мы называем get_object () Метод на Клиент с именем ведра и ключом в качестве входных аргументов для загрузки конкретного файла.

Теперь мы заинтересованы, это возвратная стоимость get_object () метод вызов. Возвратное значение – это словарь Python. В Тело Ключ словаря, мы можем найти содержимое файла, загруженного из S3. Тело Данные ["body"] это BotoCore.Response. Потоковое тело Анкет Держи эту мысль.

Чтение файла CSV

Давайте переключим внимание на обработку файлов CSV. Мы хотим получить доступ к значению конкретного столбца один за другим. CSV. Диктридер Из стандартной библиотеки кажется отличным кандидатом на эту работу. Он возвращает Итератор (Класс реализует методы итератора __iter __ () и __next __ () ), что мы можем использовать для доступа к каждой строке в для петли: ряд [Column] Анкет Но что мы должны перейти к X в качестве аргумента? Согласно документации, мы должны обратиться к экземпляру читателя.

Все другие необязательные или ключевые аргументы передаются в базовый экземпляр читателя.

Там мы видим, что первый аргумент csvfile

Может быть любой объект, который поддерживает протокол итератора и возвращает строку каждый раз, когда ее Следующий () метод называется

BotoCore.Response. Потоковое тело поддерживает Протокол итератора 🎉.

К сожалению, это __next __ () Метод не возвращает строку, а байты вместо этого.

_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

Чтение файла CSV от S3

Итак, как мы можем преодолеть разрыв между BotoCore.Response. Потоковое тело Тип и тип, требуемый CVS модуль? Мы хотим «преобразовать» байты в строки в этом случае. Поэтому Кодекс модуль стандартной библиотеки Python Кажется, это место для начала.

Большинство стандартных кодеков являются текстовыми кодировками, которые кодируют текст на байты

Поскольку мы делаем наоборот, мы ищем «декодер», в частности, декодер, который может обрабатывать данные потока: Кодеки. Streamreader

Декодирует данные из потока и возвращает полученный объект.

Кодеки. Streamreader принимает Файл-подобный объект как входной аргумент. В Python это означает, что объект должен иметь Read () метод BotoCore.Response. Потоковое тело имеет Read () Метод: https://botocore.amazonaws.com/v1/documentation/api/latest/reference/response.html#botocore.response.streamingbody.read

С тех пор, как Кодеки. Streamreader Также поддерживает протокол итератора, мы можем передать объект этого экземпляра в CSV. Диктридер : https://github.com/python/cpython/blob/1370d9dd9fbd71e9d3c250c8e6644e0ee6534fca/Lib/codecs.py#L642-L651

Последний кусок головоломки: как мы создаем Кодеки. Streamreader ? Вот где Codecs.getReader () Функция входит в игру. Мы передаем кодек по нашему выбору (в данном случае, UTF-8 ) в Codecs.getReader () , который создает Кодеки. Streamreader Анкет Это позволяет нам прочитать строку файла CSV в словаре, передавая кодек Streamreader в CSV. Диктридер :

Спасибо за то, что следили за этим длинным и подробным (возможно, слишком утомительным) объяснением такой короткой программы. Надеюсь, вы найдете это полезным. Спасибо, что слушаете ❤.

Оригинал: “https://dev.to/shihanng/how-to-read-csv-file-from-amazon-s3-in-python-4ee9”