Как реализовать argparse в Python - PullRequest
0 голосов
/ 18 апреля 2020

Я новичок в Python, у меня есть небольшой скрипт для загрузки файлов на S3, на данный момент я жестко закодировал только один файл в скрипте, имя корзины также жестко закодировано.

Я хотел объединить argparse в этом скрипте, чтобы я мог сам добавить некоторые аргументы и загрузить разные файлы. Например, в командной строке я могу указать аргументы, чтобы решить file_name x загрузить на bucket_name xxx.

Я читал документы о том, как установить argparse, но я могу вносить только небольшие изменения и не знаю, как реализовать это с помощью функции в моем скрипте (я думаю, os.rename будет ненужным, потому что мы сами разберем аргументы). Я знаю логи c, просто им трудно реализовать их в реальном коде ... Может кто-то дал мне пример или намекнул, большое спасибо.

1 Ответ

3 голосов
/ 18 апреля 2020

Вот как будет выглядеть скрипт с аргументами командной строки.

import argparse
import datetime
import logging
import os
import boto3


def make_new_key(filename: str):
    current_date = datetime.datetime.today().strftime('%Y-%m-%d_%H_%M_%S')
    # The next line handles the case where you are passing the
    # full path to the file as opposed to just the name
    name = os.path.basename(filename)

    parts = name.split('.')
    new_name = f"{parts[0]}{current_date}.csv"
    return new_name

def upload_to_s3(source_filename: str, new_name: str, bucket: str):
    logging.info(f"Uploading to S3 from {source_filename} to {bucket} {key}")
    s3_client = boto3.client("s3")
    with open(source_filename, 'rb') as file:
        response = s3_client.put_object(Body=file,
                                        Bucket=bucket,
                                        Key=new_name,
                                        ACL="bucket-owner-full-control")
        logging.info(response)


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('--filename')
    parser.add_argument('--bucket')
    args = parser.parse_args()

    new_name = make_new_key(args.filename)
    upload_to_s3(args.filename, new_name, args.bucket)

Тогда вы бы назвали скрипт так:

python upload.py --filename path/to/file --bucket name_of_bucket
...