Как скачать файл snappy.parquet с s3 с помощью Boto в Python

Я новичок в этом, и я пытаюсь загрузить файл snappy.parquet из Amazon s3, который позже могу конвертировать в файл CSV. Я попытался работать со следующим примером, который я нашел в Интернете, и я получил пустую папку. Кто-нибудь может мне помочь, пожалуйста?

import boto
import sys, os
from boto.s3.key import Key
from boto.exception import S3ResponseError

DOWNLOAD_LOCATION_PATH =""
BUCKET_NAME = ""
AWS_ACCESS_KEY_ID= ""
AWS_ACCESS_SECRET_KEY = ""
conn  = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_ACCESS_SECRET_KEY)
bucket = conn.get_bucket(BUCKET_NAME)

#goto through the list of files
bucket_list = bucket.list()
for l in bucket_list:
    key_string = str(l.key)
    s3_path = DOWNLOAD_LOCATION_PATH + key_string

    try:
        print ("Current File is ", s3_path)
        l.get_contents_to_filename(s3_path)
    except (OSError, S3ResponseError) as e:
        pass
        # check if the file has been downloaded locally
        if not os.path.exists(s3_path):
            try:
                os.makedirs(s3_path)
            except OSError as exc:
                # let guard againts race conditions
                import errno

                if exc.errno != errno.EEXIST:
                    raise

1 ответ

Используемый вами скрипт рекурсивно загружает содержимое указанного сегмента S3 (BUCKET_NAME) в указанный локальный каталог (DOWNLOAD_LOCATION_PATH). FWIW, я заметил, что этот скрипт выглядит так, как будто он отсюда.

Выходная строка "Текущий файл..." должна показывать ход выполнения записи этих файлов. Одна из проблем, с которой вы можете столкнуться, связана с этой строкой:

s3_path = DOWNLOAD_LOCATION_PATH + key_string

Если бы вы указали DOWNLOAD_LOCATION_PATH вверху как каталог без завершающего символа '/', например, так:

DOWNLOAD_LOCATION_PATH = '/tmp/my_dir'

тогда загружаемые файлы будут записаны не под /tmp/my_dir каталог, но прямо в /tmp/ с my_dir префикс на каждое имя файла! Вы можете исправить это, изменив эту строку на:

    s3_path = os.path.join(DOWNLOAD_LOCATION_PATH, key_string)

Кроме этого, сценарий работает нормально. Вы можете добавить эту строку в самом верху:

from __future__ import print_function

если вы все еще используете Python 2.x, иначе вывод на печать будет выглядеть немного странно (print будет думать, что вы печатаете 2-кортеж).

Ваш вопрос также звучит так, как будто вы действительно хотите / нуждаетесь в загрузке одного файла из корзины - если это так, это не очень хороший сценарий для использования, поскольку он загружает все.

Другие вопросы по тегам