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

PythonでBoto3ライブラリを使用して、AWSリソースを使用してS3にオブジェクトをアップロードするにはどうすればよいですか?


問題の説明 − PythonでBoto3ライブラリを使用して、オブジェクトをS3にアップロードします。たとえば、test.zipをS3のBucket_1にアップロードする方法。

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

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

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

ステップ3 s3_path およびファイルパス 関数upload_object_into_s3の2つのパラメーターです

ステップ4 s3_pathを検証します AWS形式でs3://bucket_name/keyとして渡されます およびファイルパス ローカルパスとしてC:// users / filename

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

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

ステップ7 − S3パスを分割し、ルートバケット名とキーパスを分離する操作を実行します

ステップ8 −完全なファイルパスのファイル名を取得し、S3キーパスに追加します。

ステップ9 −関数 upload_fileobjを使用します ローカルファイルをS3にアップロードします。

ステップ10 −関数 wait_until_existsを使用します 操作が終了するまで待ちます。

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

ステップ12 −ファイルのアップロード中に問題が発生した場合の一般的な例外を処理します

次のコードを使用して、ファイルをAWSS3にアップロードします-

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

def upload_object_into_s3(s3_path, filepath):

   if 's3://' in filepath:
      print('SourcePath is not a valid path.' + filepath)
      raise Exception('SourcePath is not a valid path.')
   elif s3_path.find('s3://') == -1:
      print('DestinationPath is not a s3 path.' + s3_path)
      raise Exception('DestinationPath is not a valid path.')
   session = boto3.session.Session()
   s3_resource = session.resource('s3')
   tokens = s3_path.split('/')
   target_key = ""
   if len(tokens) > 3:
      for tokn in range(3, len(tokens)):
         if tokn == 3:
            target_key += tokens[tokn]
         else:
            target_key += "/" + tokens[tokn]
   target_bucket_name = tokens[2]

   file_name = PurePosixPath(filepath).name
   if target_key != '':
      target_key.strip()
      key_path = target_key + "/" + file_name
   else:
      key_path = file_name
   print(("key_path: " + key_path, 'target_bucket: ' + target_bucket_name))

   try:
      # uploading Entity from local path
      with open(filepath, "rb") as file:
      s3_resource.meta.client.upload_fileobj(file, target_bucket_name, key_path)
      try:
         s3_resource.Object(target_bucket_name, key_path).wait_until_exists()
         file.close()
      except ClientError as error:
         error_code = int(error.response['Error']['Code'])
         if error_code == 412 or error_code == 304:
            print("Object didn't Upload Successfully ", target_bucket_name)
            raise error
      return "Object Uploaded Successfully"
   except Exception as error:
      print("Error in upload object function of s3 helper: " + error.__str__())
      raise error
print(upload_object_into_s3('s3://Bucket_1/testfolder', 'c://test.zip'))

出力

key_path:/testfolder/test.zip, target_bucket: Bucket_1
Object Uploaded Successfully

  1. Pythonを使用してファイル拡張子を抽出する方法は?

    os.path.splitextメソッドを使用して、ファイル名文字列のファイル拡張子を抽出できます。パス名パスをペア(root、ext)に分割し、root + ext ==pathであり、extが空であるか、ピリオドで始まり、最大で1つのピリオドを含むようにします。 例 import os file_name = 'my_file.txt' print(os.path.splitext(file_name)) 出力 出力が表示されます- ('my_file', '.txt')

  2. Pythonを使用して複数のファイルの名前を再帰的に変更するにはどうすればよいですか?

    os.walkを使用してディレクトリを再帰的にウォークし、続いてos.renameを使用してファイルの名前を変更できます。 例 import os def replace(folder_path, old, new):     for path, subdirs, files in os.walk(folder_path):         for name in files:             if(old.lower() in name.lower()): &nbs