使用Python在S3中上传文件时,如何动态选择文件名?

时间:2018-08-02 11:05:38

标签: amazon-s3 python-3.6 boto3

我正在处理一项要求,必须将ETL脚本的日志保存到S3位置。

为此,我能够将日志存储在本地系统中,现在需要将它们上传到S3中。

为此,我编写了以下代码-

import logging
import datetime
import boto3
from boto3.s3.transfer import S3Transfer
from etl import CONFIG

FORMAT = '%(asctime)s [%(levelname)s] %(filename)s:%(lineno)s % 
(funcName)s() : %(message)s'
DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S'
logger = logging.getLogger()
logger.setLevel(logging.INFO)
S3_DOMAIN = 'https://s3-ap-southeast-1.amazonaws.com'
S3_BUCKET = CONFIG['S3_BUCKET']
filepath = ''
folder_name = 'etl_log'
filename = ''


def log_file_conf(merchant_name, table_name):
  log_filename = datetime.datetime.now().strftime('%Y-%m-%dT%H-%M-%S') + 
  '_' + table_name + '.log'
  fh = logging.FileHandler("E:/test/etl_log/" + merchant_name + "/" 
  + log_filename)
  fh.setLevel(logging.DEBUG)
  fh.setFormatter(logging.Formatter(FORMAT, DATETIME_FORMAT))
  logger.addHandler(fh)

client = boto3.client('s3', 
aws_access_key_id=CONFIG['S3_KEY'],
aws_secret_access_key=CONFIG['S3_SECRET'])
transfer = S3Transfer(client)
transfer.upload_file(filepath, S3_BUCKET, folder_name+"/"+filename)

我在这里面临的问题是,日志是为不同的商人生成的,因此它们的名称是基于商人的,这是我在保存本地时所关心的。

但是对于在S3中上传,我不知道如何选择日志文件名。

有人可以帮助我实现我的目标吗?

1 个答案:

答案 0 :(得分:1)

s3是一个对象存储,它没有“真实路径”,即所谓的路径。 “ /”分隔符实际上是修饰符。因此,没有什么可以阻止您使用与本地文件命名约定类似的东西。例如

transfer.upload_file(filepath, S3_BUCKET, folder_name+"/" + merchant_name + "/" + filename)

要列出任意路径下的所有文件(称为“前缀”),只需执行此操作

# simple list object, not handling pagination. max 1000 objects listed
client.list_objects( 
  Bucket = S3_BUCKET, 
  Prefix = folder_name + "/" + merchant_name
)