python - fmt = self.fmt(value) TypeError: 传递给 NoneType.__format__ 的格式字符串不受支持
问题描述
#! /usr/bin/env python3
import boto3, datetime, sys, getopt, re
from operator import itemgetter
from table_logger import TableLogger
class buck:
TARIFAWS = 0.023 # 0,023 USD por GB (Primeiros 50 TB por mês)
counter = 0
def __init__(self, s3bucket):
buck.counter = buck.counter + 1
self.name = s3bucket.name
self.creationdate = s3bucket.creation_date
self.size = self.metricCloudwatch(s3bucket,"BucketSizeBytes", "StandardStorage")
self.nbreObj = self.metricCloudwatch(s3bucket,"NumberOfObjects", "AllStorageTypes")
try:
boto3.client('s3').get_bucket_encryption(Bucket=s3bucket.name)
self.number = True
except:
self.number = False
self.region = (boto3.client('s3').get_bucket_location(Bucket=s3bucket.name))['LocationConstraint']
self.cout = round(self.size / 1024**3 * self.TARIFAWS,2)
try:
boto3.client('s3').get_bucket_replication(Bucket=s3bucket.name)
self.replica = True
except:
self.replica = False
def collObjInfo(self):
s3obj = (boto3.client('s3')).list_objects_v2(Bucket=self.name)
self.lastUpdate = None
self.typeStorage = None
if s3obj['KeyCount'] != 0:
self.lastUpdate = s3obj['Contents'][0]['LastModified']
self.typeStorage = s3obj['Contents'][0]['StorageClass']
collObjInfo(self)
self.public = False
def __str__(self):
return str(self.__class__) + ": " + str(self.__dict__)
def __getitem__(self, key):
if key == 'region':
return self.region
if key == 'typeStorage':
return self.typeStorage
def getSize(self, human=False):
if human:
return humanReadable(self.size)
else:
return self.size
def metricCloudwatch(self, bucket, nameMetric, storage):
cloudwatch = boto3.client('cloudwatch')
now = datetime.datetime.now()
try:
cloudwatch_size = cloudwatch.get_metric_statistics(
Namespace='AWS/S3',
MetricName=nameMetric,
Dimensions=[
{'Name': 'BucketName', 'Value': bucket.name},
{'Name': 'StorageType', 'Value': storage}
],
Statistics=['Maximum'],
Period=86400,
StartTime=(now - datetime.timedelta(days=1)).isoformat(),
EndTime=now.isoformat()
)
if cloudwatch_size["Datapoints"]:
return cloudwatch_size["Datapoints"][0]['Maximum']
else:
return 0
except:
return 0
def humanReadable(num, suffix='B'):
for unit in ['','K','M','G','T','P']:
if abs(num) < 1024.0:
return "%3.1f%s%s" % (num, unit, suffix)
num /= 1024.0
return "%.1f%s%s" % (num, 'Yi', suffix)
def help():
print("Uso : bucket.py [OPTIONS]")
print("Exibe informações sobre buckets AWS S3, por padrão")
print("Argumentos : \n\
--help \t\t\t ajuda\n\
--crypted-only \t\t mostra apenas buckets criptografados\n\
-c, --csv \t\t mostra o resultado em CSV\n\
-s, --sorted \t\t agrupar resultados por região e grupo de armazenamento\n\
-h, --human-readable \t exibem tamanhos de 1024\n\
-f, --filter=filter \t filtra a lista de buckets com base na expressão regular FILTER")
def main():
csv=False
human = False
group = False
filterCrpt = False
filter = None
try:
opts, args = getopt.getopt(sys.argv[1:], "shcf:", ["sorted", "help", "csv", "human-readable", "crypted-only", "filter:"])
except:
print("Comando incorreto, aqui está a ajuda: ")
help()
sys.exit(2)
for opts, args in opts:
if opts == "--help":
help()
sys.exit()
elif opts == "--crypted-only":
filterCrpt = True
elif opts in ("-c", "--csv"):
csv = True
elif opts in ("-s", "--sorted"):
group = True
elif opts in ("-h", "--human-readable"):
human = True
elif opts in ("-f", "--filter"):
if len(args):
filter = args
else:
help()
sys.exit(2)
s3 = boto3.resource('s3')
bucks = []
listeS3Bucks = s3.buckets.all()
for bucket in listeS3Bucks:
try:
if filter:
re.match(filter,"Test chain")
except:
print("Regular expression error")
sys.exit(2)
if (filter and re.match(filter,bucket.name)) or not filter:
try:
bucks.append(buck(bucket))
except:
print("Erro ao conectar ao AWS, verifique suas configurações")
print("Para obter mais informações: https://docs.aws.amazon.com/cli/latest/userguide/cli-config-files.html")
sys.exit(2)
if group:
bucks = sorted(bucks, key=itemgetter('region'))
bucks = sorted(bucks, key=itemgetter('typeStorage'))
tbl = TableLogger(columns='name,creation date,last update,size,number of objects,number,storage,public,region,cost,replica',
csv=csv, border=False)
for cBuck in bucks:
if (filterCrpt and cBuck.number) or not filterCrpt:
tbl(cBuck.name, cBuck.creationdate, cBuck.lastUpdate, cBuck.getSize(human), str(cBuck.nbreObj),
cBuck.number,cBuck.typeStorage, cBuck.public, cBuck.region, "$"+str(cBuck.cout),cBuck.replica)
if __name__ == "__main__":
main()
AWS Bucket 是一个 Python 脚本,用于从 S3 存储桶中提取统计信息。它基于 Cloudwatch 监控指标。我需要帮助,我制作了一个脚本来从 s3 存储桶中提取信息。但是,当我运行这个问题时:
File "C:\Python39\lib\site-packages\table_logger\table_logger.py", line 203, in __call__
line = self.format_row(*row_cells)
File "C:\Python39\lib\site-packages\table_logger\table_logger.py", line 207, in format_row
vals = [self.format_column(value, col) for col,
value in enumerate(args)]
File "C:\Python39\lib\site-packages\table_logger\table_logger.py", line 207, in <listcomp>able_logger.py", line 207, in <listcomp> value in enumerate(args)]
vals = [self.format_column(value, col) for col, able_logger.py", line 212, in format_column
value in enumerate(args)]
File "C:\Python39\lib\site-packages\table_logger\tmt.py", line 40, in __call__able_logger.py", line 212, in format_column
return self.formatters[col](value) ype.__format__
File "C:\Python39\lib\site-packages\table_logger\fmt.py", line 40, in __call__
fmt = self.fmt(value)
TypeError: unsupported format string passed to NoneType.__format__
错误就在这里,我怎样才能让它工作?
line 40
def collObjInfo(self):
s3obj = (boto3.client('s3')).list_objects_v2(Bucket=self.name)
self.lastUpdate = None
self.typeStorage = None
if s3obj['KeyCount'] != 0:
self.lastUpdate = s3obj['Contents'][0]['LastModified']
self.typeStorage = s3obj['Contents'][0]['StorageClass']
解决方案
推荐阅读
- r - ggplot2 组覆盖填充命令
- django - 使用 Django 视图值更新 JavaScript
- python - Pandas pivot_table 发出关于在日期类型的数据集上使用边距时推断 datetime64 的 FutureWarning
- flutter - 购买后不调用函数
- android - 布局检查器未显示可组合树
- html - 服务器代码是持续运行还是仅在用户发出请求时运行?
- bash - 安装了两个版本的 bash,来自终端的关于我正在使用哪个版本的信息冲突
- android-studio - 检查 URL 连接 Android Studio
- html - SVG 中的等宽字体具有可变宽度字形
- javascript - child() 不是函数图片上传 firebaseSDK Ver9 for Web (JavaScript)