Python:s3中的递归glob

mos*_*evi 1 python recursion glob amazon-s3 boto3

我正在尝试从 s3 中获取子目录和子目录的子目录(等等)内的镶木地板文件路径列表。

如果是我的本地文件系统,我会这样做:

import glob 

glob.glob('C:/Users/user/info/**/*.parquet', recursive=True)
Run Code Online (Sandbox Code Playgroud)

我试过使用glob方法,s3fs但是它没有递归 kwarg。

是否有我可以使用的功能或我需要自己实现它?

小智 13

您可以将 s3fs 与 glob 一起使用:

import s3fs

s3 = s3fs.S3FileSystem(anon=False)

s3.glob('your/s3/path/here/*.parquet')
Run Code Online (Sandbox Code Playgroud)

  • 通过额外的支持信息可以改进您的答案。请[编辑]添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以[在帮助中心](/help/how-to-answer)找到有关如何写出好的答案的更多信息。 (3认同)

Say*_*ane 5

我还想从 s3 存储桶下载最新文件,但位于特定文件夹中。最初,我尝试使用 glob,但找不到解决此问题的方法。最后,我构建了以下函数来解决这个问题。您可以修改此功能以使用子文件夹。

此函数将返回键值对中所有文件名和时间戳的字典

(键:file_name,值:时间戳)。

只需传递存储桶名称和前缀(即文件夹名称)。

import boto3

def get_file_names(bucket_name,prefix):
    """
    Return the latest file name in an S3 bucket folder.

    :param bucket: Name of the S3 bucket.
    :param prefix: Only fetch keys that start with this prefix (folder  name).
    """
    s3_client = boto3.client('s3')
    objs = s3_client.list_objects_v2(Bucket=bucket_name)['Contents']
    shortlisted_files = dict()            
    for obj in objs:
        key = obj['Key']
        timestamp = obj['LastModified']
        # if key starts with folder name retrieve that key
        if key.startswith(prefix):              
            # Adding a new key value pair
            shortlisted_files.update( {key : timestamp} )   
    return shortlisted_files

latest_filename = get_latest_file_name(bucket_name='use_your_bucket_name',prefix = 'folder_name/')
Run Code Online (Sandbox Code Playgroud)


AKX*_*AKX 1

S3 本身实际上没有子目录。

boto3支持S3.Client.list_objects()一个prefix参数,该参数应该为您提供存储桶中给定“目录”中的所有对象,无论它们看起来有多“深”。