Python
 Computer >> コンピューター >  >> プログラミング >> Python

Boto3を使用してAWSリソースを使用してS3からオブジェクトをダウンロードするにはどうすればよいですか?


問題の説明 − Pythonでboto3ライブラリを使用して、S3から特定のローカルパス/デフォルトパスにあるオブジェクトをダウンロードし、既存のファイルをtrueとして上書きします。たとえば、S3のBucket_1/testfolderからtest.zipをダウンロードします。

この問題を解決するためのアプローチ/アルゴリズム

ステップ1 −例外を処理するためにboto3およびbotocore例外をインポートします。

ステップ2 pathlibから 、パスをインポートしてファイル名を確認します

ステップ3 s3_path、localpath およびoverwrite_existing_file 関数download_object_from_s3の3つのパラメーターです

ステップ4 s3_pathを検証します AWS形式でs3://bucket_name/keyとして渡されます 。デフォルトでは、 localpath =None およびoverwrite_existing_file=True 。ユーザーはこれらの値を渡して、特定のローカルパスにダウンロードすることもできます

ステップ5 −boto3ライブラリを使用してAWSセッションを作成します。

ステップ6 −S3用のAWSリソースを作成します。

ステップ7 − S3パスを分割し、操作を実行して、ダウンロードするルートバケット名とオブジェクトパスを分離します。

ステップ8 overwrite_existing_fileかどうかを確認します Falseに設定すると、ファイルは特定のローカルパスにすでに存在します。その場合は何も操作しないでください。

ステップ9 −それ以外の場合(これらの条件のいずれかが当てはまらない場合)、オブジェクトをダウンロードします。 localpathが指定されている場合は、そこからダウンロードしてください。それ以外の場合は、デフォルトのパスにダウンロードします。

ステップ10 −応答コードに基づいて例外を処理し、ファイルがダウンロードされているかどうかを検証します。

ステップ11 −ファイルのダウンロード中に問題が発生した場合は、一般的な例外を処理します。

次のコードを使用して、AWSS3からファイルをダウンロードします-

import boto3
from botocore.exceptions import ClientError
from pathlib import Path

def download_object_from_s3(s3path, localPath=None,
overwrite_existing_file=True):

   if 's3://' not in s3path:
      print('Given path is not a valid s3 path.')
      raise Exception('Given path is not a valid s3 path.')

   session = boto3.session.Session()
   s3_resource = session.resource('s3')

   s3_tokens = s3path.split('/')
   bucket_name = s3_tokens[2]
   object_path = ""
   filename = s3_tokens[len(s3_tokens) - 1]
   print('Filename: ' + filename)

   if len(s3_tokens) > 4:
      for tokn in range(3, len(s3_tokens) - 1):
         object_path += s3_tokens[tokn] + "/"
      object_path += filename
   else:
      object_path += filename
   print('object: ' + object_path)
   try:
      if not overwrite_existing_file and Path.is_file(filename):
         pass
      else:
         if localPath is None:
            s3_resource.meta.client.download_file(bucket_name, object_path, filename)
         else:
            s3_resource.meta.client.download_file(bucket_name, object_path, localPath + '/' + filename)
      print('Filename: ' + filename)
      return filename
   except ClientError as error:
      if error.response['Error']['Code'] == '404':
         print(s3path + " File not found: ")
         raise Exception(s3path + " File not found: ")
   except Exception as error:
      print("Unexpected error in download_object function of s3 helper: " + error.__str__())
      raise Exception("Unexpected error in download_object function of s3 helper: " + error.__str__())

#Download into default localpath
print(download_object_from_s3("s3://Bucket_1/testfolder/test.zip"))
#Download into given path
print(download_object_from_s3("s3://Bucket_1/testfolder/test.zip","C://AWS"))
#File doesn’t exist in S3
print(download_object_from_s3("s3://Bucket_1/testfolder/abc.zip"))

出力

#Download into default localpath
Filename: test.zip
object: testfolder/test.zip
Filename: test.zip

#Download into given path
Filename: test.zip
object: testfolder/test.zip
Filename: test.zip

#File doesn’t exist in S3
Filename: abc.zip
object: testfolder/abc.zip
s3://Bucket_1/testfolder/abc.zip File not found:
botocore.exceptions.ClientError: An error occurred (404) when calling
the HeadObject operation: Not Found

注: ダウンロードするデフォルトのパスは、この関数が記述されているディレクトリです。ローカルパスが指定されていない場合、同じディレクトリにファイルがダウンロードされます。

たとえば、この関数がS3_classに書き込まれ、このクラスがC:// AWS / src / S3_classに存在する場合、ファイルtest.zipはC://AWS/src/test.zipにダウンロードされます


  1. Boto3とAWSResourceを使用して、ルートバケットがS3に存在するかどうかを判断するにはどうすればよいですか?

    問題の説明 − PythonでBoto3ライブラリを使用して、ルートバケットがS3に存在するかどうかを判断します。 例 −Bucket_1がS3に存在するかどうか。 この問題を解決するためのアプローチ/アルゴリズム ステップ1 −例外を処理するためにboto3およびbotocore例外をインポートします。 ステップ2 −boto3ライブラリを使用してAWSセッションを作成します。 ステップ3 −S3用のAWSリソースを作成します。 ステップ4 −関数 head_bucket()を使用します 。 200 OKを返します バケットが存在し、ユーザーがバケットにアクセスする権限を持ってい

  2. Boto3を使用して、AWSクライアントを使用してS3に存在するバケットのリストを取得するにはどうすればよいですか?

    問題の説明 − PythonでBoto3ライブラリを使用して、AWSに存在するすべてのバケットのリストを取得します 例 −バケットの名前を取得します– BUCKET_1、BUCKET2、BUCKET_3 この問題を解決するためのアプローチ/アルゴリズム ステップ1 −例外を処理するためにboto3およびbotocore例外をインポートします。 ステップ2 −Boto3ライブラリを使用してAWSセッションを作成します。 ステップ3 −S3用のAWSクライアントを作成します。 ステップ4 −関数list_buckets()を使用して、バケットのすべてのプロパティをResponseMet