import boto3 # 用户基本信息 access_key = "Your_Access_Key" secret_key = "Your_Secret_Key" endpoint = "Your_Endpoint" bucket_name = "Your_Bucket_Name" folder_name = "Your_Folder_Name" # 统计结果 数据结构 # Count: 文件数量 # Size: 容量大小,单位bytes # StorageTypeStandard: 标准存储 # StorageTypeIa: 低频存储 # StorageTypeGlacier: 归档存储 result = { 'Count': 0, 'Size': 0, 'StorageTypeStandard': { 'Count': 0, 'Size': 0, }, 'StorageTypeIa': { 'Count': 0, 'Size': 0, }, 'StorageTypeGlacier': { 'Count': 0, 'Size': 0, } } def get_s3_client(): """ 获取s3 client """ session = boto3.session.Session(access_key, secret_key) s3_client = session.client("s3", endpoint_url=endpoint) return s3_client def folder_statistics(bucket_name, folder_name): """ 文件夹存储类型情况统计 :param bucket_name:存储桶名称 :param folder_name:文件夹名称, 完整文件夹名, 比如: 'abc/def/ghi/jkl/' :return: None """ params = { 'Bucket': bucket_name, 'Prefix': folder_name, } # 辅助函数 更新统计结果 def _update_result(result, versions): for v in versions: # 跳过文件目录本体 if v['Key'] == params['Prefix']: continue size = v['Size'] storage = v['StorageClass'] result['Count'] += 1 result['Size'] += size if storage == 'STANDARD': storage = 'StorageTypeStandard' elif storage == 'STANDARD_IA': storage = 'StorageTypeIa' elif storage == 'GLACIER': storage = 'StorageTypeGlacier' else: continue result[storage]['Count'] += 1 result[storage]['Size'] += size s3_client = get_s3_client() resp = s3_client.list_object_versions(**params) _update_result(result, resp.get('Versions', [])) # 循环查询并更新结果直到完全遍历 while resp.get('IsTruncated', False): next_key_marker = resp.get('NextKeyMarker') next_version_id_marker = resp.get('NextVersionIdMarker') print(f'list_object_versions is truncated, NextKeyMarker = {next_key_marker}, NextVersionIdMarker = {next_version_id_marker}') params['KeyMarker'] = next_key_marker if next_version_id_marker: params['VersionIdMarker'] = next_version_id_marker resp = s3_client.list_object_versions(**params) _update_result(result, resp.get('Versions', [])) params.pop('KeyMarker', None) params.pop('VersionIdMarker', None) if __name__ == '__main__': # 输入桶名、文件夹名,进行统计 folder_statistics(bucket_name, folder_name) print(f"标准存储容量(单位bytes): {result.get('StorageTypeStandard', {}).get('Size', 0)}") print(f"标准存储文件数量: {result.get('StorageTypeStandard', {}).get('Count', 0)}") print(f"低频存储容量(单位bytes): {result.get('StorageTypeIa', {}).get('Size', 0)}") print(f"低频存储文件数量: {result.get('StorageTypeIa', {}).get('Count', 0)}") print(f"归档存储容量(单位bytes): {result.get('StorageTypeGlacier', {}).get('Size', 0)}") print(f"归档存储文件数量: {result.get('StorageTypeGlacier', {}).get('Count', 0)}") print(f"文件夹下总容量(单位bytes): {result.get('Size', 0)}") print(f"文件夹下总文件数量: {result.get('Count', 0)}")
|