根据代码功能,这个程序主要是查询一年前的文件版本数据,统计并导出超过两个版本的文件信息。我建议的函数名是 export_old_version_files_report
。
以下是优化后的代码:
import os
from datetime import datetime
def export_old_version_files_report(year_ago_num=1):
"""导出一年前的多版本文件报告"""
# 1. 计算时间范围
year_days = year_ago_num * 365
year_ago_time = timezone.now() - timezone.timedelta(days=year_days)
# 2. 查询符合条件的文件
versioned_items = query_versioned_items(year_ago_time)
if not versioned_items:
print(f"Not found {year_ago_num} year ago data.")
return
# 3. 分组并筛选出需要清理的版本
grouped_items = group_items_by_trace_uuid(versioned_items)
items_to_clean = filter_items_to_clean(grouped_items)
if not items_to_clean:
print("Not found large two version items data.")
return
# 4. 处理数据并计算总大小
processed_items = process_items_data(items_to_clean)
total_size = calculate_total_size(processed_items)
# 5. 生成报告
generate_report(processed_items, total_size)
def query_versioned_items(year_ago_time):
"""查询符合条件的文件版本"""
fieldnames = [
'id', 'trace_uuid', 'children_item', 'item_type', 'created_at',
'created_by_name', 'file_major_version_number', 'file_version_number',
'file_uuid', 'file_size'
]
return list(
version_protected=False,
item_type=ItemType.File.value,
item_status=0,
created_at__lt=year_ago_time
).exclude(
file_size=0,
file_major_version_number=0
).order_by(
'id'
).values(fieldnames)
def group_items_by_trace_uuid(items):
"""按trace_uuid分组文件"""
grouped = {}
for item in items:
trace_uuid = item.get('trace_uuid')
if trace_uuid not in grouped:
grouped[trace_uuid] = []
grouped[trace_uuid].append(item)
return grouped
def filter_items_to_clean(grouped_items):
"""筛选出需要清理的文件版本(保留最新两个版本)"""
items_to_clean = []
for trace_uuid, items in grouped_items.items():
if len(items) > 2:
items_to_clean.extend(items[:-2]) # 保留最新两个版本
return items_to_clean
def process_items_data(items):
"""处理项目数据(格式化时间等)"""
processed = []
for item in items:
processed_item = item.copy()
created_at = item.get('created_at')
processed_item['created_at'] = self._format_to_beijing_str(created_at)
processed.append(processed_item)
return processed
def calculate_total_size(items):
"""计算总文件大小"""
total = sum(item.get('file_size', 0) for item in items)
return self._human_readable_size(total)
def generate_report(items, total_size):
"""生成报告文件"""
fieldnames = [
'id', 'trace_uuid', 'children_item', 'item_type', 'created_at',
'created_by_name', 'file_major_version_number', 'file_version_number',
'file_uuid', 'file_size'
]
# 动态生成文件名
current_time = datetime.now().strftime('%Y%m%d%H%M')
file_name = f'report-{current_time}.csv'
report_path = os.path.join('D:', file_name)
print(f"Total file size {total_size}")
self._write_to_csv(report_path, fieldnames, items)
优化点:
- 将代码拆分为多个单一职责的函数,提高可读性和可维护性
- 使用动态生成报告文件名,包含当前时间
- 使用列表推导式和生成器表达式简化计算逻辑
- 添加了docstring文档说明
- 使用
os.path.join
构建文件路径,提高跨平台兼容性 - 将硬编码的字段名提取为变量,减少重复
- 主函数提供默认参数,增加灵活性
变量名优化:
all_last_two_items
→items_to_clean
更准确地表达了变量的用途trace_uuid_version_items
→items
在局部作用域中简化变量名last_tow_items
→items_to_clean
修正拼写错误并统一命名
注意:代码中仍有一些未定义的类和方法(如 self._format_to_beijing_str
, self._write_to_csv
等),需要根据实际项目情况进行实现或调整。