删除amazons3对象时,Python Boto3错误“预期的string或byteslike对象”

2024-05-01 22:08:35 发布

您现在位置:Python中文网/ 问答频道 /正文

当我试图测试用python3.7boto3-AWS-SDK编写的lambda函数时,下面的代码行(lambda代码块中的最后一行)遇到了问题。lambda函数删除S3 bucket中的对象,遍历bucket中的每个对象

client.Object(bucket, key).delete()

当我保存并运行代码时,在前面的一行(也是下面lambda函数代码块的最后一行)中出现的错误如下所示。请求帮助。你知道吗

"errorMessage": "expected string or bytes-like object",  "errorType": "TypeError"

[Lambda功能代码块]

import boto3
import json
import uuid
import csv

def lambda_handler(event, context):

   recordId = str(uuid.uuid4())
   print (recordId)
   client = boto3.resource(
       's3',
   region_name='us-east-1',
       aws_access_key_id='XXXXXXXXXXXXXXX' ,
       aws_secret_access_key='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
   )    

   bucket = client.Bucket('my_bucket')

   dynamodb = boto3.resource('dynamodb')

   table = dynamodb.Table('my_dynamo')

   for obj in bucket.objects.all():
        key = obj.key
        body = obj.get()['Body'].read()
        data = body.decode("utf-8") 
        data1 = data.split('\n')

        client.Object(bucket, key).delete()

Tags: 对象lambdakey函数代码importclientobj
3条回答

在上面的代码中,您使用bucket对象来删除。 你需要替换

 client.Object(bucket, key).delete()

 client.Object(bucket.name, key).delete()

因为bucket名称和key应该是string

import boto3

bucketName = "your bucketname"
s3 = boto3.resource('s3')
s3.Object(bucketName, key).delete()

我已使用客户端进行删除。不是资源。 这个很好用。你可以试试这个。你知道吗

client_s3 = boto3.client('s3')
res = client_s3.list_objects(Bucket=bucket_name)
for list_key in res['Contents']:
    client_s3.delete_object(Bucket=bucket_name, Key=list_key['Key'])

这是res['Contents']的结构,如果您需要获得任何其他详细信息:

'Key': 'string',
'LastModified': datetime(2015, 1, 1),
'ETag': 'string',
'Size': 123,
'StorageClass':'STANDARD'|'REDUCED_REDUNDANCY'|'GLACIER'|'STANDARD_IA'|'ONEZONE_IA'|'INTELLIGENT_TIERING'|'DEEP_ARCHIVE',
'Owner': {
          'DisplayName': 'string',
          'ID': 'string'
}

相关问题 更多 >