【发布时间】:2021-06-05 15:15:01
【问题描述】:
如何重命名 S3 存储桶中的多个输出文件。作为一个例子,我正在使用
os.path.basename(keyprefix),
'w' 写入模式文件
abc_00000.csv.gz
abc_00001.csv.gz
我想用命名约定重命名上述文件:
abc_{today date in YYYYMMDD format}_00.csv.gz
abc_{today date in YYYYMMDD format}_01.csv.gz
以下是参考代码:
import boto3
import os
from smart_open import open
import gzip
import csv
import io
def lambda_handler(event, context):
dirpath = 'output/'
bucket = 'export'
key = 'export/_SUCCESS'
if '_SUCCESS' in key:
client = boto3.client('s3')
response = client.list_objects_v2(Bucket=bucket,Prefix=os.path.dirname(key))
for i in response['Contents']:
keyprefix = i['Key']
if 'part-' in keyprefix:
with gzip.GzipFile(fileobj=client.get_object(Bucket=bucket,Key=keyprefix)['Body']) as gzipfile, open('s3://'+bucket + '/' + dirpath + os.path.basename(keyprefix),'w') as fout :
writer = csv.writer(fout , delimiter=',')
writer.writerow(['test1','test1','test3','test4','test5','test6','test7'])
for row in csv.reader(gzipfile.read().decode('utf-8').splitlines(), delimiter=',', quotechar='"'):
if row[5] == 'CDE':
writer.writerow(row)
【问题讨论】:
-
我建议看看S3 Batch Operations basics。在您的情况下,不确定重命名的规模是多少。进行批量操作的高效且干净的方式。
-
嗨@samtoddler,谢谢。它最多10-15个文件。
-
仅供参考,您无法在 S3 中重命名对象。您必须从旧密钥复制到新密钥,然后删除旧密钥。
-
有什么方法可以在提供的 python 脚本中编写所需的命名约定?
标签: python python-3.x amazon-web-services amazon-s3 aws-lambda