【问题标题】:Can't read PNG files from S3 in Python 3?无法在 Python 3 中从 S3 读取 PNG 文件?
【发布时间】:2020-04-26 08:06:33
【问题描述】:

我在 S3 上有一个存储桶。 我希望能够连接到它并将图片/PDF 读入我的 EC2 机器内存,执行 OCR 并获取所需的字段。

这是我到目前为止所做的,但不幸的是它不起作用。

import cv2
import boto3
import matplotlib
import pytesseract
from PIL import Image


boto3.setup_default_session(profile_name='default-mfasession')
s3_client = boto3.client('s3')
s3_resource = boto3.resource('s3')
bucket_name = "my_bucket"
key = "my-files/._Screenshot 2020-04-20 at 14.21.20.png"

bucket = s3_resource.Bucket(bucket_name)
object = bucket.Object(key)
response = object.get()
file_stream = response['Body']
im = Image.open(file_stream)
np.array(im)

返回一个错误:

UnidentifiedImageError: 无法识别图像文件 <_io.bytesio>

我已经尝试了所有与此问题相关的答案,所以没有任何帮助。 包含: matplotlib: ValueError: invalid PNG headerPIL cannot identify image file for io.BytesIO object

请指教如何解决?

【问题讨论】:

  • 您确定、绝对、确定一个PNG文件吗?即,您并没有盲目相信文件扩展名或其他工具所说的内容,而是使用十六进制查看器打开它并看到了魔术字节标题(和其他易于识别的部分)?
  • @usr2564301 我知道我的存储桶里有什么,但这一点在我脑海中(我可能会得到 PDF、GIF、JPEG ... 带有图像的文件,我需要解析它们。

标签: python-3.x amazon-s3 boto3


【解决方案1】:

这是我通常使用的。也许它也适合你:

def image_from_s3(bucket, key):

    bucket = s3_resource.Bucket(bucket)
    image = bucket.Object(key)
    img_data = image.get().get('Body').read()

    return Image.open(io.BytesIO(img_data))

然后在你的处理程序中执行这个:

    img = image_from_s3(image_bucket, image_key)

img 应该是 Pillow 成功执行的图像。

【讨论】:

  • AttributeError: 'S3' 对象没有属性 'Bucket' @marcin
  • 我觉得应该是s3_resource。我稍微编辑了代码。
  • 仍然不起作用... UnidentifiedImageError: 无法识别图像文件 <_io.bytesio object at> @marcin
  • 你能分享一个不起作用的示例 png 吗?我或其他人可以尝试复制问题。
  • 它是 .filename(点文件名)可能是缓存或其他东西。修复了它,它现在可以工作了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 1970-01-01
  • 2019-07-17
  • 2012-04-18
相关资源
最近更新 更多