Удаление специальных символов из ключа объекта S3 для задания транскрибирования

#amazon-web-services #aws-lambda #aws-transcribe

#amazon-веб-сервисы #aws-lambda #aws-transcribe

Вопрос:

Это самая первая лямбда-функция, которую я создал, и до сегодняшнего дня я никогда не писал ни строчки на Python. У меня есть опыт программирования на языке APEX от Salesforce, поэтому я могу понять большую часть этого.

У меня есть эта лямбда-функция, которая захватывает объект (wav) из S3 и отправляет его в AWS Transcribe. Я хочу, чтобы имя задания транскрибирования было именем объекта S3, которое я могу выполнить, если имя является чем-то простым, например, «recording.wav». Моя проблема возникает, когда у меня сложное имя типа «4A6E388B48D454FA993D52611ADD1AB_INT — Integris Health_epowell@bcinsourcing.com_8082924979__2_X — Survey.wav» из-за того, что специальные символы все портят.

Может кто-нибудь подсказать мне простой способ удалить все эти специальные символы и заменить их символами подчеркивания? Я попытался использовать unquote_plus, но это не решило мою проблему.

Вот лямбда-код:

 import boto3
from urllib.parse import unquote_plus
#Create low level clients for s3 and Transcribe
s3  = boto3.client('s3')
transcribe = boto3.client('transcribe')
def lambda_handler(event, context):
    
    #parse out the bucket amp; file name from the event handler
    for record in event['Records']:
        file_bucket = record['s3']['bucket']['name']
        file_name = record['s3']['object']['key']
        file_name_only = unquote_plus(record['s3']['object']['key'])
        object_url = 'https://s3.amazonaws.com/{0}/{1}'.format(file_bucket, file_name)
            
        response = transcribe.start_transcription_job(
            TranscriptionJobName=file_name_only,
            LanguageCode='en-US',
            MediaFormat='wav',
            Media={
                'MediaFileUri': object_url
            })
        
        print(response)
 

Вот ошибка от AWS CloudWatch:
введите описание изображения здесь

Ответ №1:

Вы можете использовать простое регулярное выражение для замены всех не буквенно-цифровых символов:

 # Just for testing
record = {'s3': {'object': {'key': 'path/to/bad - file@with:symbols!.wav'}}}

import re
# Use a simple regexp to replace all non alphanumeric characters
file_name_only = re.sub("[^a-zA-Z0-9]", "_", record['s3']['object']['key'])
print(file_name_only)

# Outputs: path_to_bad___file_with_symbols__wav