如何使用 python 和 boto3 检查 S3 存储桶中是否存在特定目录

Ash*_*uGG 22 amazon-s3 python-3.x boto3

如何检查 S3 中的特定目录中是否存在特定文件?我使用 Boto3 并尝试了这段代码(不起作用):

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket')
key = 'dootdoot.jpg'
objs = list(bucket.objects.filter(Prefix=key))
if len(objs) > 0 and objs[0].key == key:
    print("Exists!")
else:
    print("Doesn't exist")
Run Code Online (Sandbox Code Playgroud)

Sai*_*ish 28

检查S3文件夹时,有两种情况:

场景1

import boto3

def folder_exists_and_not_empty(bucket:str, path:str) -> bool:
    '''
    Folder should exists. 
    Folder should not be empty.
    '''
    s3 = boto3.client('s3')
    if not path.endswith('/'):
        path = path+'/' 
    resp = s3.list_objects(Bucket=bucket, Prefix=path, Delimiter='/',MaxKeys=1)
    return 'Contents' in resp
Run Code Online (Sandbox Code Playgroud)
  • 上面的代码使用了MaxKeys=1. 这样效率更高。即使文件夹包含大量文件,它也会快速响应仅其中一个内容。
  • 观察它的Contents响应检查

场景2

import boto3

def folder_exists(bucket:str, path:str) -> bool:
    '''
    Folder should exists. 
    Folder could be empty.
    '''
    s3 = boto3.client('s3')
    path = path.rstrip('/') 
    resp = s3.list_objects(Bucket=bucket, Prefix=path, Delimiter='/',MaxKeys=1)
    return 'CommonPrefixes' in resp
Run Code Online (Sandbox Code Playgroud)
  • 观察它从路径中剥离最后一个/。此前缀将仅检查该文件夹,而不检查该文件夹内。
  • 观察它检查CommonPrefixes响应而不是Contents


小智 10

import boto3
import botocore

client = boto3.client('s3')
def checkPath(file_path):
  result = client.list_objects(Bucket="Bucket", Prefix=file_path )
  exists=False
  if 'Contents' in result:
      exists=True
  return exists
Run Code Online (Sandbox Code Playgroud)

如果提供的 file_path 存在则返回 True。示例: 's3://bucket/dir1/dir2/dir3/file.txt' file_path: 'dir1/dir2' 或 'dir1/' 注意:- 文件路径应从存储桶名称之后的第一个目录开始。


Sar*_*avu 5

基本上,目录/文件是 S3 的一个对象。我为 this ( ) 创建了一个IsObjectExists返回Trueor的方法False。如果目录/文件不存在,它不会进入循环,因此方法返回False,否则它将返回True

import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('<givebucketnamehere>')

def IsObjectExists(path):
    for object_summary in bucket.objects.filter(Prefix=path):
        return True
    return False

if(IsObjectExists("<giveobjectnamehere>")):
   print("Directory/File exists")
else:
   print("Directory/File doesn't exists")
Run Code Online (Sandbox Code Playgroud)

请注意,如果您要检查文件夹,请确保以/. 一个用例是,当您尝试检查名为 的文件夹时Hello,如果该文件夹不存在,则存在一个名为 的文件夹Hello_World。在这种情况下,方法将返回True。在这种情况下,您必须/在编码时将字符添加到文件夹名称的末尾。您可以在下面的示例中看到这是如何处理的

foldername = "Hello/"
if(IsObjectExists(foldername))
    print("Directory/File exists")
Run Code Online (Sandbox Code Playgroud)


Wil*_*eng 0

请尝试以下代码

\n

获取子目录信息文件夹\xc2\xb6

\n
folders = bucket.list("","/")\nfor folder in folders:\n    print (folder.name)\n
Run Code Online (Sandbox Code Playgroud)\n

PS 参考 URL(如何使用 python 脚本通过 boto 将文件从 Amazon S3 的一个存储桶复制到另一个存储桶

\n

  • 在 boto3 中获取“文件夹”列表的方法是``objects = s3.list_objects_v2(Bucket=BUCKET_NAME, Delimiter='/', Prefix='')``` (2认同)