web-dev-qa-db-fra.com

Comment télécharger des fichiers depuis s3 étant donné le chemin du fichier en utilisant boto3 dans python

Assez basique mais je ne suis pas en mesure de télécharger des fichiers étant donné le chemin s3.

par exemple, j'ai ce s3://name1/name2/file_name.txt

import boto3
locations = ['s3://name1/name2/file_name.txt']
s3_client = boto3.client('s3')
bucket = 'name1'
prefix = 'name2'

for file in locations:
    s3_client.download_file(bucket, 'file_name.txt', 'my_local_folder')

Je reçois une erreur en tant que botocore.exceptions.ClientError: An error occurred (404) when calling the HeadObject operation: Not Found

Ce fichier existe comme lors du téléchargement. en utilisant aws cli comme s3 path: s3://name1/name2/file_name.txt .

5
Atihska

Vous devrez peut-être le faire avec un certain type d'authentification. Il existe plusieurs méthodes, mais la création d'une session est simple et rapide:

from boto3.session import Session

bucket_name = 'your_bucket_name'
folder_prefix = 'your/path/to/download/files'
credentials = 'credentials.txt'

with open(credentials, 'r', encoding='utf-8') as f:
    line = f.readline().strip()
    access_key = line.split(':')[0]
    secret_key = line.split(':')[1]

session = Session(
    aws_access_key_id=access_key,
    aws_secret_access_key=secret_key
)

s3 = session.resource('s3')
bucket = s3.Bucket(bucket_name)

for s3_file in bucket.objects.filter(Prefix=folder_prefix):
    file_object = s3_file.key
    file_name = str(file_object.split('/')[-1])
    print('Downloading file {} ...'.format(file_object))
    bucket.download_file(file_object, '/tmp/{}'.format(file_name))

Dans credentials.txt fichier vous devez ajouter une seule ligne où vous concaténerez l'ID de la clé d'accès et le secret, par exemple:

~$ cat credentials.txt
AKIAIO5FODNN7EXAMPLE:ABCDEF+c2L7yXeGvUyrPgYsDnWRRC1AYEXAMPLE

N'oubliez pas de bien protéger ce fichier sur votre hôte, accordez des autorisations en lecture seule à l'utilisateur qui exécute ce programme. J'espère que cela fonctionne pour vous, cela fonctionne parfaitement pour moi.

1
JavDomGom