Python boto3 textract start\ U document\ U text\ U检测不接受s3上输入文件的文件夹
我编写了一个lambda来从存储在s3中的图像文件中提取文本。lambda由新对象触发。图像存储在文件夹中。 当我测试存储在S3存储桶根目录下的文件时,一切正常。当我使用文件夹时,东西会断开 当documentLocation如下所示时:Python boto3 textract start\ U document\ U text\ U检测不接受s3上输入文件的文件夹,python,amazon-web-services,aws-lambda,boto3,amazon-textract,Python,Amazon Web Services,Aws Lambda,Boto3,Amazon Textract,我编写了一个lambda来从存储在s3中的图像文件中提取文本。lambda由新对象触发。图像存储在文件夹中。 当我测试存储在S3存储桶根目录下的文件时,一切正常。当我使用文件夹时,东西会断开 当documentLocation如下所示时: {'S3Object': {'Bucket': 'extractbucket', 'Name': 'img024.jpg'}} `{'S3Object': {'Bucket': 'extractbucket', 'Name': 'afold/img024.j
{'S3Object': {'Bucket': 'extractbucket', 'Name': 'img024.jpg'}}
`{'S3Object': {'Bucket': 'extractbucket', 'Name': 'afold/img024.jpg'}}`
一切正常
当它看起来像这样时:
{'S3Object': {'Bucket': 'extractbucket', 'Name': 'img024.jpg'}}
`{'S3Object': {'Bucket': 'extractbucket', 'Name': 'afold/img024.jpg'}}`
我有一个例外
复制步骤
这是我的lambda函数Python3.8,区域:us-east-2:
import json
import boto3
def lambda_handler(event, context):
bucket="extractbucket"
client = boto3.client('textract')
jobFile = event['Records'][0]['s3']['object']['key']
#process using S3 object
docLoc = {
"S3Object":{
"Bucket": bucket,
"Name": jobFile
}
}
response = client.start_document_text_detection(
DocumentLocation=docLoc,
JobTag=jobFile,
NotificationChannel={
"RoleArn":"arn:aws:iam::xxxxx:role/Textract_demo_sns",
"SNSTopicArn": "arn:aws:sns:us-east-2:xxxxx:TxtExtractComplete"
}
)
return {
'statusCode': 200,
'body': json.dumps("sent filejobID:" + jobFile + " to queue")
}
我使用一个S3触发器测试来测试它,将文件名放在object/key中。当我使用根文件进行测试时,一切正常,当我使用文件夹中的文件进行测试时,一切都会中断。休息时间如下:
调试日志
非常感谢您的帮助。我的测试表明,start\u document\u text\u检测可以很好地处理子目录中的对象
我怀疑该键包含类似URL的字符,而不是纯斜杠。您可以通过打印jobFile的值并查看日志以查看该值来测试这一点
以下是避免此问题的代码:
bucket=event['Records'][0]['s3']['bucket']['name']
key=urllib.parse.unquote_plusevent['Records'][0]['s3']['object']['key']
您还需要导入urllib。作业标记标识符不接受空格或符号,包括“/” 因此,当添加带有文件夹的文件并将密钥分配给JobTag时,JobTag会检测到斜杠,并返回无效参数错误
解决方案:使用python删除/替换jobtag中的斜杠感谢您的建议!我已经试过了,但同样的问题仍然存在。我一直在打印jobFile和DocLoc,但它看起来像一个普通的斜杠,事实上,这就是我在测试脚本中键入的内容,我用一个从打印的sns响应中复制的斜杠进行了测试。我还检查了我的IAM角色,我只是使用通用的S3角色,因此也没有限制。我获取了您的代码,并使用Bucket和Name的硬编码值运行它。我只提供了DocumentLocation和JobName,以便于测试。尝试自己删除通知,看看是否仍然会出现相同的错误。啊哈!现在我们知道了一些事情。问题似乎在于工作标签和钥匙。我假设JobTag接受字符串时,它会很容易地接受密钥。恐怕这不是很容易。我希望使用jobtag来传递信息,我可以在文本提取完成后获取这些信息,而不需要将其单独存储在数据库中,很高兴你能找到它