source

boto를 사용하여 S3 버킷의 디렉토리에 파일을 업로드하는 방법

gigabyte 2023. 7. 18. 22:58
반응형

boto를 사용하여 S3 버킷의 디렉토리에 파일을 업로드하는 방법

저는 파이썬을 사용하여 s3 버킷에 있는 파일을 복사하고 싶습니다.

예 : 버킷 이름 = 시험이 있습니다.그리고 양동이에는 "dump"와 "input"이라는 두 개의 폴더가 있습니다.이제 python을 사용하여 로컬 디렉터리에서 S3 "dump" 폴더로 파일을 복사하고 싶습니다...누가 나를 도와줄 수 있나요?

참고: 이 답변은 다음을 사용합니다.boto다음을 사용하는 다른 답변 보기boto3새로운 것.

해보세요...

import boto
import boto.s3
import sys
from boto.s3.key import Key

AWS_ACCESS_KEY_ID = ''
AWS_SECRET_ACCESS_KEY = ''

bucket_name = AWS_ACCESS_KEY_ID.lower() + '-dump'
conn = boto.connect_s3(AWS_ACCESS_KEY_ID,
        AWS_SECRET_ACCESS_KEY)


bucket = conn.create_bucket(bucket_name,
    location=boto.s3.connection.Location.DEFAULT)

testfile = "replace this with an actual filename"
print 'Uploading %s to Amazon S3 bucket %s' % \
   (testfile, bucket_name)

def percent_cb(complete, total):
    sys.stdout.write('.')
    sys.stdout.flush()


k = Key(bucket)
k.key = 'my test file'
k.set_contents_from_filename(testfile,
    cb=percent_cb, num_cb=10)

[UPDATE] 저는 파이썬 주자가 아니기 때문에 수입 명세서에 대해 알려주셔서 감사합니다.또한 자신의 소스 코드 안에 자격 증명을 넣는 것도 권장하지 않습니다.AWS에서 이를 실행하는 경우 인스턴스 프로파일이 포함된 IAM 자격 증명(http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html), 을 사용하고 개발/테스트 환경에서 동일한 동작을 유지하려면 AdRoll의 홀로그램(https://github.com/AdRoll/hologram) 을 사용합니다.

import boto3

s3 = boto3.resource('s3')
BUCKET = "test"

s3.Bucket(BUCKET).upload_file("your/local/file", "dump/file")

자격 증명을 사용하여 세션 내의 s3에 파일을 업로드합니다.

import boto3

session = boto3.Session(
    aws_access_key_id='AWS_ACCESS_KEY_ID',
    aws_secret_access_key='AWS_SECRET_ACCESS_KEY',
)
s3 = session.resource('s3')
# Filename - File to upload
# Bucket - Bucket to upload to (the top level directory under AWS S3)
# Key - S3 object name (can contain subdirectories). If not specified then file_name is used
s3.meta.client.upload_file(Filename='input_file_path', Bucket='bucket_name', Key='s3_output_key')

그렇게 복잡하게 만들 필요가 없습니다.

s3_connection = boto.connect_s3()
bucket = s3_connection.get_bucket('your bucket name')
key = boto.s3.key.Key(bucket, 'some_file.zip')
with open('some_file.zip') as f:
    key.send_file(f)

저는 이것을 사용했고 그것은 구현하기 매우 간단합니다.

import tinys3

conn = tinys3.Connection('S3_ACCESS_KEY','S3_SECRET_KEY',tls=True)

f = open('some_file.zip','rb')
conn.upload('some_file.zip',f,'my_bucket')

https://www.smore.com/labs/tinys3/

from boto3.s3.transfer import S3Transfer
import boto3
#have all the variables populated which are required below
client = boto3.client('s3', aws_access_key_id=access_key,aws_secret_access_key=secret_key)
transfer = S3Transfer(client)
transfer.upload_file(filepath, bucket_name, folder_name+"/"+filename)

이것은 세 개의 라이너입니다.boto3 설명서의 지침을 따르십시오.

import boto3
s3 = boto3.resource(service_name = 's3')
s3.meta.client.upload_file(Filename = 'C:/foo/bar/baz.filetype', Bucket = 'yourbucketname', Key = 'baz.filetype')

몇 가지 중요한 인수는 다음과 같습니다.

매개 변수:

  • 파일 이름(str) - 업로드할 파일의 경로입니다.
  • 버킷(str) - 업로드할 버킷의 이름입니다.
  • (str) -- s3 버킷의 파일에 할당할 의 이름.파일 이름과 같거나 선택한 다른 이름일 수 있지만 파일 형식은 동일해야 합니다.

    참고: 자격 증명을 에 저장했다고 가정합니다.~\.awsboto3 설명서의 모범적인 구성 방법에 제시된 대로 폴더에 저장할 수 있습니다.

  • 이 기능도 작동합니다.

    import os 
    import boto
    import boto.s3.connection
    from boto.s3.key import Key
    
    try:
    
        conn = boto.s3.connect_to_region('us-east-1',
        aws_access_key_id = 'AWS-Access-Key',
        aws_secret_access_key = 'AWS-Secrete-Key',
        # host = 's3-website-us-east-1.amazonaws.com',
        # is_secure=True,               # uncomment if you are not using ssl
        calling_format = boto.s3.connection.OrdinaryCallingFormat(),
        )
    
        bucket = conn.get_bucket('YourBucketName')
        key_name = 'FileToUpload'
        path = 'images/holiday' #Directory Under which file should get upload
        full_key_name = os.path.join(path, key_name)
        k = bucket.new_key(full_key_name)
        k.set_contents_from_filename(key_name)
    
    except Exception,e:
        print str(e)
        print "error"   
    

    boto3 사용하기

    import logging
    import boto3
    from botocore.exceptions import ClientError
    
    
    def upload_file(file_name, bucket, object_name=None):
        """Upload a file to an S3 bucket
    
        :param file_name: File to upload
        :param bucket: Bucket to upload to
        :param object_name: S3 object name. If not specified then file_name is used
        :return: True if file was uploaded, else False
        """
    
        # If S3 object_name was not specified, use file_name
        if object_name is None:
            object_name = file_name
    
        # Upload the file
        s3_client = boto3.client('s3')
        try:
            response = s3_client.upload_file(file_name, bucket, object_name)
        except ClientError as e:
            logging.error(e)
            return False
        return True
    

    자세한 내용: - https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-uploading-files.html

    import boto
    from boto.s3.key import Key
    
    AWS_ACCESS_KEY_ID = ''
    AWS_SECRET_ACCESS_KEY = ''
    END_POINT = ''                          # eg. us-east-1
    S3_HOST = ''                            # eg. s3.us-east-1.amazonaws.com
    BUCKET_NAME = 'test'        
    FILENAME = 'upload.txt'                
    UPLOADED_FILENAME = 'dumps/upload.txt'
    # include folders in file path. If it doesn't exist, it will be created
    
    s3 = boto.s3.connect_to_region(END_POINT,
                               aws_access_key_id=AWS_ACCESS_KEY_ID,
                               aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
                               host=S3_HOST)
    
    bucket = s3.get_bucket(BUCKET_NAME)
    k = Key(bucket)
    k.key = UPLOADED_FILENAME
    k.set_contents_from_filename(FILENAME)
    

    다음 코드 및 S3 폴더 사진과 같은 업로드 폴더의 경우

    import boto
    import boto.s3
    import boto.s3.connection
    import os.path
    import sys    
    
    # Fill in info on data to upload
    # destination bucket name
    bucket_name = 'willie20181121'
    # source directory
    sourceDir = '/home/willie/Desktop/x/'  #Linux Path
    # destination directory name (on s3)
    destDir = '/test1/'   #S3 Path
    
    #max size in bytes before uploading in parts. between 1 and 5 GB recommended
    MAX_SIZE = 20 * 1000 * 1000
    #size of parts when uploading in parts
    PART_SIZE = 6 * 1000 * 1000
    
    access_key = 'MPBVAQ*******IT****'
    secret_key = '11t63yDV***********HgUcgMOSN*****'
    
    conn = boto.connect_s3(
            aws_access_key_id = access_key,
            aws_secret_access_key = secret_key,
            host = '******.org.tw',
            is_secure=False,               # uncomment if you are not using ssl
            calling_format = boto.s3.connection.OrdinaryCallingFormat(),
            )
    bucket = conn.create_bucket(bucket_name,
            location=boto.s3.connection.Location.DEFAULT)
    
    
    uploadFileNames = []
    for (sourceDir, dirname, filename) in os.walk(sourceDir):
        uploadFileNames.extend(filename)
        break
    
    def percent_cb(complete, total):
        sys.stdout.write('.')
        sys.stdout.flush()
    
    for filename in uploadFileNames:
        sourcepath = os.path.join(sourceDir + filename)
        destpath = os.path.join(destDir, filename)
        print ('Uploading %s to Amazon S3 bucket %s' % \
               (sourcepath, bucket_name))
    
        filesize = os.path.getsize(sourcepath)
        if filesize > MAX_SIZE:
            print ("multipart upload")
            mp = bucket.initiate_multipart_upload(destpath)
            fp = open(sourcepath,'rb')
            fp_num = 0
            while (fp.tell() < filesize):
                fp_num += 1
                print ("uploading part %i" %fp_num)
                mp.upload_part_from_file(fp, fp_num, cb=percent_cb, num_cb=10, size=PART_SIZE)
    
            mp.complete_upload()
    
        else:
            print ("singlepart upload")
            k = boto.s3.key.Key(bucket)
            k.key = destpath
            k.set_contents_from_filename(sourcepath,
                    cb=percent_cb, num_cb=10)
    

    PS: 더 많은 참조용

    시스템에 aws 명령줄 인터페이스를 설치한 경우 pythons 하위 프로세스 라이브러리를 사용할 수 있습니다.예:

    import subprocess
    def copy_file_to_s3(source: str, target: str, bucket: str):
       subprocess.run(["aws", "s3" , "cp", source, f"s3://{bucket}/{target}"])
    

    마찬가지로 파일 다운로드 또는 나열과 같은 모든 종류의 AWS 클라이언트 작업에 해당 로직을 사용할 수 있습니다.반환 값을 얻을 수도 있습니다.이렇게 하면 bot3를 수입할 필요가 없습니다.저는 그것의 사용이 그런 식으로 의도된 것이 아니라고 생각하지만 실제로는 그렇게 하는 것이 꽤 편리하다고 생각합니다.이렇게 하면 콘솔에 표시되는 업로드 상태를 확인할 수 있습니다. 예:

    Completed 3.5 GiB/3.5 GiB (242.8 MiB/s) with 1 file(s) remaining
    

    원하는 대로 방법을 수정하려면 하위 프로세스 참조와 AWS CLI 참조를 검토하는 것이 좋습니다.

    참고: 이것은 유사한 질문에 대한 제 대답의 사본입니다.

    제가 보기에 주문량이 좀 더 많은 것 같습니다.

    import boto3
    from pprint import pprint
    from botocore.exceptions import NoCredentialsError
    
    
    class S3(object):
        BUCKET = "test"
        connection = None
    
        def __init__(self):
            try:
                vars = get_s3_credentials("aws")
                self.connection = boto3.resource('s3', 'aws_access_key_id',
                                                 'aws_secret_access_key')
            except(Exception) as error:
                print(error)
                self.connection = None
    
    
        def upload_file(self, file_to_upload_path, file_name):
            if file_to_upload is None or file_name is None: return False
            try:
                pprint(file_to_upload)
                file_name = "your-folder-inside-s3/{0}".format(file_name)
                self.connection.Bucket(self.BUCKET).upload_file(file_to_upload_path, 
                                                                          file_name)
                print("Upload Successful")
                return True
    
            except FileNotFoundError:
                print("The file was not found")
                return False
    
            except NoCredentialsError:
                print("Credentials not available")
                return False
    
    
    

    여기에는 버킷 상수, file_to_uploadfile_name이라는 세 가지 중요한 변수가 있습니다.

    BUCKET S3의 입니다.

    file_to_upload_path해야 합니다.

    file_name버킷의 결과 파일 및 경로(폴더를 추가하는 위치 또는 기타 위치)

    여러 가지 방법이 있지만 다음과 같은 다른 스크립트에서 이 코드를 재사용할 수 있습니다.

    import S3
    
    def some_function():
        S3.S3().upload_file(path_to_file, final_file_name)
    

    파일 액세스 문제를 생략하려면 내용 유형도 언급해야 합니다.

    import os
    image='fly.png'
    s3_filestore_path = 'images/fly.png'
    filename, file_extension = os.path.splitext(image)
    content_type_dict={".png":"image/png",".html":"text/html",
                   ".css":"text/css",".js":"application/javascript",
                   ".jpg":"image/png",".gif":"image/gif",
                   ".jpeg":"image/jpeg"}
    
    content_type=content_type_dict[file_extension]
    s3 = boto3.client('s3', config=boto3.session.Config(signature_version='s3v4'),
                      region_name='ap-south-1',
                      aws_access_key_id=S3_KEY,
                      aws_secret_access_key=S3_SECRET)
    s3.put_object(Body=image, Bucket=S3_BUCKET, Key=s3_filestore_path, ContentType=content_type)
    
    xmlstr = etree.tostring(listings,  encoding='utf8', method='xml')
    conn = boto.connect_s3(
            aws_access_key_id = access_key,
            aws_secret_access_key = secret_key,
            # host = '<bucketName>.s3.amazonaws.com',
            host = 'bycket.s3.amazonaws.com',
            #is_secure=False,               # uncomment if you are not using ssl
            calling_format = boto.s3.connection.OrdinaryCallingFormat(),
            )
    conn.auth_region_name = 'us-west-1'
    
    bucket = conn.get_bucket('resources', validate=False)
    key= bucket.get_key('filename.txt')
    key.set_contents_from_string("SAMPLE TEXT")
    key.set_canned_acl('public-read')
    

    여기에 있는 많은 기존 답변들은 매우 복잡합니다.간단한 접근 방식은 를 사용하는 것입니다. 이는 다음과 같습니다.boto3.

    먼저, 사용자 인증을 올바르게 수행해야 합니다.~/.aws/credentials파일 또는 환경 변수가 설정되었습니다.cloudpathlib 문서에서 더 많은 옵션을 확인할 수 있습니다.

    파일을 업로드하는 방법은 다음과 같습니다.

    from pathlib import Path
    from cloudpathlib import CloudPath
    
    # write a local file that we will upload:
    Path("test_file.txt").write_text("hello")
    #> 5
    
    # upload that file to S3
    CloudPath("s3://drivendata-public-assets/testsfile.txt").upload_from("test_file.txt")
    #> S3Path('s3://mybucket/testsfile.txt')
    
    # read it back from s3
    CloudPath("s3://mybucket/testsfile.txt").read_text()
    #> 'hello'
    

    참: 일을사여클라경드직쓸을 사용하여 직접 쓸 수 .write_text,write_bytes또는open방법들 또한.

    저는 당신의 샘플을 약간 수정했고, 일부 수입품과 보토 샘플에 필요한 것을 얻기 위한 진행 상황을 삭제했습니다.

    import boto.s3
    from boto.s3.key import Key
    
    AWS_ACCESS_KEY_ID = 'your-access-key-id'
    AWS_SECRET_ACCESS_KEY = 'your-secret-access-key'
    
    bucket_name = AWS_ACCESS_KEY_ID.lower() + '-form13'
    conn = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
    bucket = conn.create_bucket(bucket_name, location=boto.s3.connection.Location.DEFAULT)
    filename = 'embedding.csv'
    
    k = Key(bucket)
    k.key = filename
    k.set_contents_from_filename(filename)
    

    다음은 bot3의 예이기도 합니다.

    import boto3
    
    ACCESS_KEY = 'your-access-key'
    SECRET_KEY = 'your-secret-key'
    
    file_name='embedding.csv'
    object_name=file_name
    bucket_name = ACCESS_KEY.lower() + '-form13'
    
    s3 = boto3.client('s3', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY)
    s3.create_bucket(Bucket=bucket_name)
    s3.upload_file(file_name, bucket_name, object_name)
    

    언급URL : https://stackoverflow.com/questions/15085864/how-to-upload-a-file-to-directory-in-s3-bucket-using-boto

    반응형