При создании класса я получаю ошибку типа: отсутствует 1 требуемый аргумент позиции

#python #csv #amazon-s3

Вопрос:

Я пытаюсь загрузить csv-файлы в s3. Когда я пытаюсь создать класс вокруг методов, я получаю Type Error: upload_file_to_s3bucket() missing 1 required positional argument: 'file_path' . Он успешно работает без класса.

 class S3Upload():

    def __init__(self, filename=TEST_FILE, filetype='.csv'):
        self.filename = filename
        self.type = filetype

    def make_bucket(self, name, acl):
        session = aws_session()
        s3_resource = session.resource('s3')
        return s3_resource.create_bucket(Bucket=name, ACL=acl)

    def upload_file_to_s3bucket(self, bucket_name, file_path):
        session = aws_session()
        s3_resource = session.resource('s3')
        file_dir, file_name = os.path.split(file_path)

        bucket = s3_resource.Bucket(bucket_name)
        bucket.upload_file(
        Filename=file_path,
        Key=file_name,
        ExtraArgs={'ACL': 'public-read'}
        )

        s3_url = f"https://{bucket_name}.s3.amazonaws.com/{file_name}"
        return s3_url

    s3_url = upload_file_to_s3bucket('mitch-demo', TEST_FILE)
    print(s3_url) # https://mitch-demo.s3.amazonaws.com/simple.csv

if __name__ == '__main__':
    S3 = S3Upload(TEST_FILE)
    S3.make_bucket()
    S3.upload_file_to_s3bucket()
 

Комментарии:

1.Почему вы вызываете upload_file_to_s3bucket определение класса? Вы вызываете его как обычную функцию, но ей все равно нужны 3 аргумента: экземпляр S3Upload , имя корзины и имя файла.

2. С какой стати ты занимаешься s3_url = upload_file_to_s3bucket('mitch-demo', TEST_FILE) в классном корпусе? Чего вы ожидали от этого?

Ответ №1:

В этой строке

     s3_url = upload_file_to_s3bucket('mitch-demo', TEST_FILE)
 

Вы передаете два аргумента для имени корзины и пути к файлу, как определено в вашем методе

 def upload_file_to_s3bucket(self, bucket_name, file_path):
 

Но в вашем более позднем коде вы этого не делаете, поэтому он ошибается. На самом деле это происходит дважды… Вам нужно передать значения, в которых я разместил комментарии:

 S3.make_bucket(#you need to add a name and acl arguments)
S3.upload_file_to_s3bucket(# you need to add bucket name and file path arguments)