Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.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 如何从AmazonS3 bucket中删除文件?_Python_Amazon S3_Bucket - Fatal编程技术网

Python 如何从AmazonS3 bucket中删除文件?

Python 如何从AmazonS3 bucket中删除文件?,python,amazon-s3,bucket,Python,Amazon S3,Bucket,我需要用python编写代码,从AmazonS3存储桶中删除所需的文件。我可以连接到Amazon s3存储桶,也可以保存文件,但如何删除文件?通过哪个接口?使用REST界面,您只需: 通过: 引用 纳尔逊 ,它应该会公开一个“delete”功能,比如。现在我已经使用Linux实用程序解决了这个问题。我在Python中这样使用它: delFile = 's3cmd -c /home/project/.s3cfg del s3://images/anon-images/small/' + file

我需要用python编写代码,从AmazonS3存储桶中删除所需的文件。我可以连接到Amazon s3存储桶,也可以保存文件,但如何删除文件?

通过哪个接口?使用REST界面,您只需:

通过:


引用
纳尔逊

,它应该会公开一个“delete”功能,比如。

现在我已经使用Linux实用程序解决了这个问题。我在Python中这样使用它:

delFile = 's3cmd -c /home/project/.s3cfg del s3://images/anon-images/small/' + filename
os.system(delFile)

找到了使用boto的另一种方法:

from boto.s3.connection import S3Connection, Bucket, Key

conn = S3Connection(AWS_ACCESS_KEY, AWS_SECERET_KEY)

b = Bucket(conn, S3_BUCKET_NAME)

k = Key(b)

k.key = 'images/my-images/'+filename

b.delete_key(k)

我很惊讶没有这么简单的方法:
key.delete()

使用(并假设为AWS设置了凭据),以下操作将删除bucket中的指定对象:

import boto3

client = boto3.client('s3')
client.delete_object(Bucket='mybucketname', Key='myfile.whatever')
使用
boto3
(当前版本为1.4.4)使用


这对我有用,试试看

import boto
import sys
from boto.s3.key import Key
import boto.s3.connection

AWS_ACCESS_KEY_ID = '<access_key>'
AWS_SECRET_ACCESS_KEY = '<secret_access_key>'
Bucketname = 'bucket_name' 

conn = boto.s3.connect_to_region('us-east-2',
        aws_access_key_id=AWS_ACCESS_KEY_ID,
        aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
        is_secure=True,              
        calling_format = boto.s3.connection.OrdinaryCallingFormat(),
        )
bucket = conn.get_bucket(Bucketname)

k = Key(bucket)

k.key = 'filename to delete'
bucket.delete_key(k)   
导入boto
导入系统
从boto.s3.key导入密钥
导入boto.s3.connection
AWS\u访问\u密钥\u ID=“”
AWS_SECRET_ACCESS_KEY=''
Bucketname='bucket_name'
conn=boto.s3.将_连接到_地区('us-east-2',
aws\u访问\u密钥\u id=aws\u访问\u密钥\u id,
aws_secret_access_key=aws_secret_access_key,
安全吗,
调用_format=boto.s3.connection.OrdinaryCallingFormat(),
)
bucket=conn.get_bucket(Bucketname)
k=钥匙(铲斗)
k、 key='要删除的文件名'
bucket.delete_键(k)

您可以使用aws cli:和一些unix命令来执行此操作

此aws cli命令应能正常工作:

aws s3 rm s3://<your_bucket_name> --exclude "*" --include "<your_regex>" 
aws s3 ls s3://<your_bucket_name>/ | awk '{print $4}' | xargs -I%  <your_os_shell>   -c 'aws s3 rm s3:// <your_bucket_name>  /% $1'
aws s3 rm s3://--排除“*”--包括“”
如果要包括子文件夹,则应添加标志--recursive

或使用unix命令:

aws s3 rm s3://<your_bucket_name> --exclude "*" --include "<your_regex>" 
aws s3 ls s3://<your_bucket_name>/ | awk '{print $4}' | xargs -I%  <your_os_shell>   -c 'aws s3 rm s3:// <your_bucket_name>  /% $1'
aws s3 ls s3://| awk'{print$4}'| xargs-I%-c'aws s3 rm s3:///%$1'
说明:

  • 列出bucket上的所有文件--pipe-->
  • 获取第四个参数(文件名)--pipe-->//您可以使用linux命令替换它以匹配您的模式
  • 使用aws cli运行删除脚本
  • 试着寻找一个合适的答案,因为Boto3可能会不时变化。我使用了我的\u桶。删除\u对象()

    import boto3
    from boto3.session import Session
    
    session = Session(aws_access_key_id='your_key_id',
                      aws_secret_access_key='your_secret_key')
    
    # s3_client = session.client('s3')
    s3_resource = session.resource('s3')
    my_bucket = s3_resource.Bucket("your_bucket_name")
    
    response = my_bucket.delete_objects(
        Delete={
            'Objects': [
                {
                    'Key': "your_file_name_key"   # the_name of_your_file
                }
            ]
        }
    )
    
    

    如果您试图使用自己的本地主机控制台删除文件,那么可以尝试运行此python脚本,前提是您已经在系统中分配了访问id和密钥

    导入boto3
    #我的习俗
    aws\u m=boto3.session.session(profile\u name=“本地主机上的配置文件名”)
    客户机=aws_m.客户机('s3')
    #删除前列出bucket对象
    响应=client.list\u对象(
    Bucket='your-Bucket-name'
    )
    对于响应中的x.get(“内容”,无):
    打印(x.get(“键”,无));
    #删除bucket对象
    response=client.delete\u对象(
    Bucket='your-Bucket-name',
    Key='mydocs.txt'
    )
    #删除后列出bucket对象
    响应=client.list\u对象(
    Bucket='your-Bucket-name'
    )
    对于响应中的x.get(“内容”,无):
    打印(x.get(“键”,无));
    
    欢迎来到2020这里是Python/Django的答案:

    from django.conf import settings 
    import boto3   
    s3 = boto3.client('s3')
    s3.delete_object(Bucket=settings.AWS_STORAGE_BUCKET_NAME, Key=f"media/{item.file.name}")
    

    我花了太长时间才找到答案,答案就这么简单。

    以下内容对我来说很有用(基于Django模型的示例,但您可以自行使用
    delete
    方法的代码)


    最简单的方法是:

    import boto3
    s3 = boto3.resource("s3")
    bucket_source = {
                'Bucket': "my-bcuket",
                'Key': "file_path_in_bucket"
            }
    s3.meta.client.delete(bucket_source)
    

    下面是您可以用来删除bucket的代码段

    import boto3, botocore
    from botocore.exceptions import ClientError
    
    s3 = boto3.resource("s3",aws_access_key_id='Your-Access-Key',aws_secret_access_key='Your-Secret-Key')
    s3.Object('Bucket-Name', 'file-name as key').delete()
    
    请尝试此代码

    import boto3   
    s3 = boto3.client('s3')
    s3.delete_object(Bucket="s3bucketname", Key="s3filepath")
    
    使用中的函数

    您可以一次删除一个或多个文件:

    import s3fs
    file_system = s3fs.S3FileSystem()
    
    file_system.rm('s3://my-bucket/foo.txt')  # single file
    
    files = ['s3://my-bucket/bar.txt', 's3://my-bucket/baz.txt']
    file_system.rm(files)  # several files
    

    您使用哪个(如果有的话)Python库来支持S3?或者您要直接使用Python代码中的REST或SOAP接口?我正在使用Python库boto.s3是的,我正在使用该Python库,但这会删除该文件吗?我应该这样做:k.key='images/anon images/small/'+文件名k.delete_key()是否正确?请让我知道。@Suhail:我还没有用过那个库,但从我链接的源代码来看,它实际上是通过REST接口调用
    DELETE
    。因此,是的,尽管名称为“delete_key”(我同意这一点尚不清楚),它实际上是在删除该键引用的对象。删除许多名称中带有公共前缀的文件怎么样?S3是否允许对这种情况进行批量删除,或者必须一个一个地删除它们(这很慢)?@Saman:我不是S3专家,但据我所知,您只能删除特定的文件。但是你可能想把它作为一个问题来问,所以它会引起S3专家的注意。它有两个视图:)如果你想删除bucket中的所有内容,你可以这样做:
    对于b.list()中的x:b.delete_key(x.key)
    我喜欢我的文件中的bucket.list()是
    bucket.list()
    为了让这个代码片段像现在这样工作,你还需要导入
    bucket
    key
    。例如:
    来自boto.s3.connection导入s3连接,Bucket,Key
    我从boto.s3.connection导入s3连接,Bucket,Key回溯(最近一次调用):文件“”,第1行,在ImportError中:没有名为boto.s3.connection的模块
    请更新boto3的答案找出了它并编写了一个解决方案调用子shell与s3通信并不完全是pythonic(库或直接HTTP事务会更优雅),但它仍然可以工作。我认为它不值得投否决票+1.@Rob boto3文档具有误导性。如果对象已版本化,它将创建一个删除标记。否则将删除该对象。干净且简单。可能是可接受的答案,并且肯定应该与@Kohányi Róbert的答案合并,因为两者都是完成任务的最佳方法。如果对象不存在,它会抛出错误吗?@AkashTantri我个人没有尝试过,但医生说它会删除空版本(如果有)[…]如果没有空版本,AmazonS3不删除任何对象。所以我猜它不会抛出错误。如果你碰巧尝试一下(只要做点什么就行了)
    import boto3, botocore
    from botocore.exceptions import ClientError
    
    s3 = boto3.resource("s3",aws_access_key_id='Your-Access-Key',aws_secret_access_key='Your-Secret-Key')
    s3.Object('Bucket-Name', 'file-name as key').delete()
    
    import boto3   
    s3 = boto3.client('s3')
    s3.delete_object(Bucket="s3bucketname", Key="s3filepath")
    
    import s3fs
    file_system = s3fs.S3FileSystem()
    
    file_system.rm('s3://my-bucket/foo.txt')  # single file
    
    files = ['s3://my-bucket/bar.txt', 's3://my-bucket/baz.txt']
    file_system.rm(files)  # several files