Как загрузить URL в корзину s3 с помощью метода StringIO и put_object с помощью boto3 - PullRequest
0 голосов
/ 04 октября 2019

Мне нужно загрузить URL-адреса в корзину s3, и я использую boto3. Я думал, что у меня есть решение с этим вопросом: Как сохранить объект S3 в файл, используя boto3 , но когда я иду, чтобы загрузить файлы, я все еще получаю ошибки. Цель состоит в том, чтобы они загружались как аудиофайлы, а не как URL-адреса. Мой код:

    for row in list_reader:
        media_id = row['mediaId']
        external_id = row['externalId']
        with open('10-17_res1.csv', 'a') as results_file:
            file_is_empty = os.stat('10-17_res1.csv').st_size == 0
            results_writer = csv.writer(
            results_file, delimiter = ',', quotechar = '"'
            )
            if file_is_empty:
                results_writer.writerow(['fileURL','key', 'mediaId','externalId'])

            key = 'corpora/' + external_id + '/' + external_id + '.flac'
            bucketname = 'my_bucket'

            media_stream = media.get_item(media_id)
            stream_url = media_stream['streams'][0]['streamLocation']


            fake_handle = StringIO(stream_url)
            s3c.put_object(Bucket=bucketname, Key=key, Body=fake_handle.read())

Мой вопрос: что мне нужно изменить, чтобы файл сохранялся в s3 как аудиофайл, а не как URL?

1 Ответ

0 голосов
/ 05 октября 2019

Я решил это с помощью модуля smart_open:

        with smart_open.open(stream_url, 'rb',buffering=0) as f:
            s3.put_object(Bucket=bucketname, Key=key, Body=f.read())

Обратите внимание, что он не будет работать без параметра buffering = 0.

...