Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python boto3 textract start\ U document\ U text\ U检测不接受s3上输入文件的文件夹_Python_Amazon Web Services_Aws Lambda_Boto3_Amazon Textract - Fatal编程技术网

Python boto3 textract start\ U document\ U text\ U检测不接受s3上输入文件的文件夹

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

我编写了一个lambda来从存储在s3中的图像文件中提取文本。lambda由新对象触发。图像存储在文件夹中。 当我测试存储在S3存储桶根目录下的文件时,一切正常。当我使用文件夹时,东西会断开

当documentLocation如下所示时:

{'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来传递信息,我可以在文本提取完成后获取这些信息,而不需要将其单独存储在数据库中,很高兴你能找到它