OSError:尝试从s3获取图像并打开图像时,无法识别图像文件<_io.BytesIO对象位于0x00000198001B9E08> - python

我正在尝试获取jpeg。从s3存储桶中,但出现错误。这是代码的一部分:

s3_client = boto3.client('s3')
bucket = os.environ['encryption_bucket']

def encrypt_zip(event, contex):
    image_key = event['keys']
    response = s3_client.get_object(Bucket= bucket, Key=image_key)
    if response['ResponseMetadata']['HTTPStatusCode'] == 200:
        object_data = response['Body']._raw_stream.data
        print(type(object_data))
        image = Image.open(io.BytesIO(object_data))

错误:

OSError: cannot identify image file <_io.BytesIO object at 0x00000198001B9E08>

第二个问题:尝试从s3存储桶下载一个对象并保存该图像

if 's3' in event['Records'][0]:
    s3  = event['Records'][0]['s3']
    image_key  = s3['object']['key']
    key_split = str(image_key).split('/')
    job_key = "-".join(key_split)
    bucket = s3['bucket']['name']
    with open(job_key, 'wb') as data:
         client.download_fileobj(bucket, image_key, data)
         set_log("logo image loaded successfully....", False)
    image_path = '/tmp/' + job_key
    image = Image.open(job_key)
    image.save(image_path)

ERROR : OSError: cannot identify image file '8093-C8FE-2403-490B-9050e99b-53a9-4e2f-b9af-9910d5fc9a0f.jpg'

以及本地下载图像。无法加载。enter image description here

参考方案

根据您的其他问题(已删除?),您的要求是:

文件名数组传递给函数
/转换为-以简化文件名
您希望使用这些文件创建一个zip文件

因此,它将类似于:

import boto3
import zipfile

s3_client = boto3.client('s3')
bucket = os.environ['encryption_bucket']

def encrypt_zip(event, context):
    key_array = [key.replace('/', '-') for key in event['keys']]

    # Download objects
    for key in key_array:
        response = s3_client.download_file(bucket, key, '/tmp/' + key)

    # Zip objects
    with ZipFile('/tmp/foo.zip', 'w') as myzip:
        for key in key_array:
            myzip.write('/tmp/' + key)
        myzip.close()

    # Put zip file in S3
    s3_client.upload_file('/tmp/foo.zip', bucket, 'foo.zip')

(我还没有测试过,我只是从documentation复制了Zipfile代码,所以我不确定它是否正确。)

我也不确定您要使用/-做什么,因为这取决于传递的键列表以及S3中调用的对象。

Python numpy数据指针地址无需更改即可更改 - python

编辑经过一些摆弄之后,到目前为止,我已经隔离了以下状态:一维数组在直接输入变量时提供两个不同的地址,而在使用print()时仅提供一个地址2D数组(或矩阵)在直接输入变量时提供三个不同的地址,在使用print()时提供两个地址3D数组在直接输入变量时提供两个不同的地址,而在使用print()时仅给出一个(显然与一维数组相同)像这样:>>> …

Python Pandas导出数据 - python

我正在使用python pandas处理一些数据。我已使用以下代码将数据导出到excel文件。writer = pd.ExcelWriter('Data.xlsx'); wrong_data.to_excel(writer,"Names which are wrong", index = False); writer.…

Python ElementTree:在循环中替换元素 - python

我正在尝试创建一个脚本,该脚本循环创建一个xml文件,并为两个元素增加值。 (使用netaddr的IP地址,以及递增的tag / member元素,tag01-tag10)from netaddr import IPNetwork import xml.dom.minidom import lxml.etree as etree import xml.etr…

在节点有数据的地方绘制图形 - python

我有一个包含一些复杂数据的有向图。我想绘制此图并将每个节点表示为一个表。有没有办法做到这一点?我发现的所有绘图示例都只有一个标签或一些简单地绘制到节点中的示例。仅供参考:我目前正在使用networkx 参考方案 使用graphviz时,标签可以代表更复杂的东西,例如表格。Graphviz提供两种变体:Record based nodes基于记录的节点提供了一…

按列名称显示的Python Selenium复制表列 - python

我有一个包含这些标题的表,如下所示:如何使用xpath选择整列存储在数组中。我希望使用不同的数组,例如:courses = [] teacher = [] avg = [] 请记住,这些列没有任何ID或类,因此我需要一种仅使用列名进行选择的方法。这是表格的代码:<table border="0"> <tbody> …