如何在Python中使用boto3获取下载的S3对象的密钥



我从S3下载了一个文件,并将S3响应对象传递给其他函数。

我认为密钥/文件名必须存储在这个对象本身的某个地方,但我似乎找不到它。我不想把文件名传给每个需要它的函数。

我所有的谷歌搜索只是显示如何在不下载的情况下从bucket中获取文件名,而不是如何从响应中获取文件名称。

我正在使用Python/Boto3:

def main():
file = s3.Object("my cool bucket", "my cool file").get()
process_file(file)
def process_file(file):
print(file.name) 
# how do I make this work w/o passing in filename as arg to original function

get_object(…)的响应不会返回响应对象中的键("filename")。

它返回以下属性,但这些属性都不是密钥。

不幸的是,您必须将最初用于获取对象的密钥/文件名传递给任何其他需要它的函数

{
'Body': StreamingBody(),
'DeleteMarker': True|False,
'AcceptRanges': 'string',
'Expiration': 'string',
'Restore': 'string',
'LastModified': datetime(2015, 1, 1),
'ContentLength': 123,
'ETag': 'string',
'MissingMeta': 123,
'VersionId': 'string',
'CacheControl': 'string',
'ContentDisposition': 'string',
'ContentEncoding': 'string',
'ContentLanguage': 'string',
'ContentRange': 'string',
'ContentType': 'string',
'Expires': datetime(2015, 1, 1),
'WebsiteRedirectLocation': 'string',
'ServerSideEncryption': 'AES256'|'aws:kms',
'Metadata': {
'string': 'string'
},
'SSECustomerAlgorithm': 'string',
'SSECustomerKeyMD5': 'string',
'SSEKMSKeyId': 'string',
'BucketKeyEnabled': True|False,
'StorageClass': 'STANDARD'|'REDUCED_REDUNDANCY'|'STANDARD_IA'|'ONEZONE_IA'|'INTELLIGENT_TIERING'|'GLACIER'|'DEEP_ARCHIVE'|'OUTPOSTS',
'RequestCharged': 'requester',
'ReplicationStatus': 'COMPLETE'|'PENDING'|'FAILED'|'REPLICA',
'PartsCount': 123,
'TagCount': 123,
'ObjectLockMode': 'GOVERNANCE'|'COMPLIANCE',
'ObjectLockRetainUntilDate': datetime(2015, 1, 1),
'ObjectLockLegalHoldStatus': 'ON'|'OFF'
}

您可以使用以下代码获取路径&单独的文件名:

bkt_obj = conn_s3.Bucket(bkt_name)
for obj in bkt_obj.objects.all():
if obj.key[-1] != '/' and obj.key[-1] != '$':
file = obj.key
path, filename = os.path.split(obj.key)
filename = os.path.basename(file)
print(f"FILE: {obj.key} -> {path}  -> {filename}")

输出:

FILE: dir1/dir1_file.txt -> dir1  -> dir1_file.txt
FILE: mydatafile.csv ->   -> mydatafile.csv

你可以在上面的代码后添加这个,你想得到下载文件的确切路径:

path_local_files='/home/user/s3_data/'
dest_file = os.path.join(path_local_files, filename)
print(f" --------> {dest_file}")  #use this variable if need of full path
#bkt_obj.download_file(obj.key, dest_file) #download file

相关内容

  • 没有找到相关文章

最新更新