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)
我还想从 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)