FEATURED · 精选文章

Python实现文件目录自动扫描与Excel超链接索引生成工具

发布时间 / 2026/8/20 3:41:15
来源 / 创域科博编辑部
栏目 / 资讯中心
Python实现文件目录自动扫描与Excel超链接索引生成工具 你是不是也遇到过这样的场景电脑里存了几百个G的项目资料、学习视频、设计素材每次想找某个文件都得在层层文件夹里“大海捞针”或者作为团队负责人需要快速盘点服务器上的文档资产却只能手动复制粘贴路径耗时费力还容易出错更让人头疼的是即使你费劲整理出一个文件列表发给同事后对方还得自己手动去资源管理器里一层层点开——沟通成本高协作效率低。这正是很多开发者和团队管理者在文件资产管理中面临的真实痛点。今天要介绍的这个解决方案可能比你想象的要简单得多一个能自动扫描本地文件夹、生成带超链接的Excel索引文件的工具。它不是什么复杂的商业软件而是用Python就能实现的轻量级脚本。核心价值在于将散乱的文件目录转化为一个可搜索、可排序、可一键直达的“资源地图”。这篇文章我会带你从零开始手把手实现这个工具。你不仅能得到一个即拿即用的脚本更重要的是理解其背后的设计思路、关键代码实现以及如何根据你的实际需求进行定制。无论是个人整理学习资料还是团队搭建文档台账这个工具都能显著提升效率。1. 这个工具到底解决了什么问题在深入代码之前我们首先要明确这个工具瞄准的是哪些具体场景以及它和“复制路径”这种原始操作的本质区别。核心痛点一信息孤岛与查找低效。对于存放大量非结构化文件如代码库、设计稿、报告、媒体文件的目录其价值被文件夹结构“锁死”了。你想知道某个类型的文件有多少分布在哪些子文件夹只能靠记忆或手动遍历。这个工具通过生成结构化的Excel表格让文件信息变得可检索、可分析。核心痛点二协作链路断裂。当你把文件路径以文本形式如D:\project\docs\spec_v2.1.docx发给同事时他必须手动打开资源管理器并粘贴路径。任何一点差错如多一个空格都会导致打开失败。而带有file://协议超链接的Excel单元格实现了“所见即所得所点即所开”——点击链接系统会自动用文件资源管理器打开目标文件所在的文件夹并高亮该文件协作指令零损耗传递。核心痛点三缺乏资产视图。“本地资源台账”听起来有点正式但其本质就是一个清晰的资产清单。对于管理者可以快速统计文件数量、类型分布、最新修改时间对于个人可以梳理知识体系。这个工具生成的Excel配合其自带的筛选、排序功能就是一个轻量级、可视化的资产管理系统。因此这个工具的价值不在于技术有多高深而在于它用极低的成本一个脚本打通了从“文件存储”到“文件使用”的最后一公里实现了资产可视化和访问一键化。2. 核心原理与技术选型要实现“扫描目录 - 生成带超链接的Excel”这个流程我们需要拆解几个关键技术点目录遍历与文件信息获取需要递归地扫描指定文件夹及其所有子文件夹并获取每个文件的绝对路径、名称、大小、修改时间等元数据。数据结构化存储将获取到的文件信息路径、名称等组织成程序易于处理的结构如Python的列表List或字典Dictionary。Excel文件生成与格式化将结构化的数据写入Excel文件并确保格式美观如列宽自适应、标题行加粗等。超链接的创建这是核心体验所在。需要在Excel单元格中创建指向本地文件路径的超链接。其本质是在单元格中写入一个公式例如HYPERLINK(“file:///D:/test/readme.txt”, “readme.txt”)。当用户点击时Excel会调用操作系统协议处理器打开该路径。为什么选择Python生态成熟os模块用于文件遍历pandas用于数据处理和Excel写入openpyxl或xlsxwriter用于精细控制Excel格式包括超链接组合起来非常高效。跨平台代码在Windows、macOS、Linux上稍作调整主要是路径分隔符和file://协议格式即可运行。易于定制Python脚本修改灵活你可以很容易地添加过滤条件如只扫描.pdf文件、添加自定义列如计算MD5、或改变输出格式。工具流程全景图开始 ↓ 输入目标文件夹路径 ↓ 递归遍历收集文件信息 ↓ 将信息构建为DataFrame ↓ 使用库如openpyxl创建Excel工作簿 ↓ 将数据写入工作表并为“路径”列创建超链接公式 ↓ 设置表格样式列宽、字体、边框 ↓ 保存Excel文件 ↓ 结束整个过程清晰可控接下来我们进入实战环节。3. 环境准备与依赖安装首先确保你的电脑上安装了Python。推荐使用Python 3.7及以上版本。你可以通过命令行输入python --version或python3 --version来检查。我们将使用两个核心库pandas用于数据处理openpyxl用于生成和格式化Excel文件。openpyxl对包含公式如超链接的.xlsx文件支持很好。安装依赖打开你的终端Windows CMD/PowerShell, macOS Terminal, Linux Shell执行以下命令pip install pandas openpyxl如果你使用的是Anaconda环境也可以用conda install pandas openpyxl来安装。安装完成后可以创建一个新的Python脚本文件例如命名为generate_file_index.py。4. 核心代码模块拆解与实现我们将整个工具的实现分解为四个函数每个函数职责单一便于理解和维护。4.1 遍历目录并收集文件信息这个函数是工具的“数据采集器”。它接收一个根目录路径递归地访问所有子目录和文件并将每个文件的信息收集到一个列表中。import os import pandas as pd from datetime import datetime def scan_directory(root_dir): 递归扫描指定目录收集文件信息。 参数: root_dir (str): 要扫描的根目录路径。 返回: list: 包含文件信息的字典列表。每个字典包含 - full_path: 文件的绝对路径 - relative_path: 相对于根目录的路径 - file_name: 文件名含扩展名 - file_size: 文件大小字节 - modified_time: 最后修改时间 - file_type: 文件扩展名 file_list [] # 确保传入的是绝对路径并且标准化将反斜杠统一为正斜杠便于后续处理 root_dir os.path.abspath(root_dir) # os.walk 是遍历目录树的利器 for dirpath, dirnames, filenames in os.walk(root_dir): for filename in filenames: full_path os.path.join(dirpath, filename) # 计算相对于根目录的路径这有助于在Excel中展示清晰的层级关系 relative_path os.path.relpath(full_path, root_dir) try: # 获取文件状态信息 stat_info os.stat(full_path) file_size stat_info.st_size # 字节数 # 将时间戳转换为可读的字符串格式 modified_time datetime.fromtimestamp(stat_info.st_mtime).strftime(%Y-%m-%d %H:%M:%S) except OSError: # 如果文件无法访问如权限问题则跳过或使用默认值 file_size 0 modified_time N/A # 分离文件名和扩展名 file_name filename # 获取文件扩展名小写无扩展名的文件返回空字符串 file_type os.path.splitext(filename)[1].lower() file_info { full_path: full_path, relative_path: relative_path, file_name: file_name, file_size: file_size, modified_time: modified_time, file_type: file_type } file_list.append(file_info) return file_list关键点说明os.walk()Python标准库中遍历目录树最方便的方法它会生成每个目录下的文件夹名和文件名列表。os.path模块用于安全地拼接、拆分路径获取相对路径等避免手动处理路径分隔符\或/的问题。异常处理使用try...except包裹文件状态获取逻辑防止因个别文件权限问题导致整个扫描过程中断。相对路径记录relative_path非常重要它能让用户在Excel中一眼看出文件在项目结构中的位置。4.2 构建数据表格并计算友好显示收集到的原始数据如文件大小是字节对用户不友好。我们需要将其转换为更易读的格式如KB, MB并构建一个结构清晰的表格。def format_file_size(bytes_size): 将字节数格式化为更易读的单位KB, MB, GB。 参数: bytes_size (int): 文件大小的字节数。 返回: str: 格式化后的字符串如 1.5 MB。 if bytes_size 0: return 0 B # 定义单位 units [B, KB, MB, GB, TB] i 0 size float(bytes_size) while size 1024 and i len(units) - 1: size / 1024.0 i 1 # 保留两位小数并添加单位 return f{size:.2f} {units[i]} def create_dataframe(file_list): 将文件信息列表转换为pandas DataFrame并进行格式化。 参数: file_list (list): scan_directory函数返回的文件信息字典列表。 返回: pandas.DataFrame: 格式化后的数据表格。 if not file_list: print(警告未扫描到任何文件。) return pd.DataFrame() # 直接将字典列表转换为DataFrame df pd.DataFrame(file_list) # 应用格式化将字节大小转换为易读字符串 df[file_size_formatted] df[file_size].apply(format_file_size) # 调整列的顺序让表格更直观 # 我们将创建超链接的列放在前面方便点击 columns_order [file_name, relative_path, file_type, file_size, file_size_formatted, modified_time, full_path] # 确保DataFrame中只包含我们需要的列按顺序 df df[columns_order] # 重命名列标题使其对用户更友好 df.columns [文件名, 相对路径, 文件类型, 文件大小(字节), 文件大小, 修改时间, 完整路径超链接] return df关键点说明format_file_size函数这是一个经典的字节格式化工具函数将1024字节显示为1.00 KB提升可读性。pandas.DataFrame这是数据分析的核心数据结构。我们利用它来轻松地重排列顺序、重命名列名以及后续的写入Excel操作。列设计我们保留了原始的“文件大小(字节)”列供可能的程序化处理同时新增了“文件大小”列供人阅读。full_path列将用于生成超链接但列标题我们命名为“完整路径超链接”以提示用户。4.3 生成带超链接的Excel文件这是最核心的一步。我们需要使用openpyxl库因为它支持在单元格中写入HYPERLINK公式这是创建可点击超链接的关键。from openpyxl import Workbook from openpyxl.utils import get_column_letter from openpyxl.styles import Font, Alignment, Border, Side def save_to_excel_with_hyperlink(df, output_filefile_index.xlsx): 将DataFrame保存为Excel文件并为“完整路径”列创建可点击的超链接。 参数: df (pandas.DataFrame): 包含文件信息的DataFrame。 output_file (str): 输出的Excel文件名。 if df.empty: print(数据为空未创建Excel文件。) return # 1. 创建一个新的工作簿和工作表 wb Workbook() ws wb.active ws.title 文件索引 # 2. 写入表头 headers list(df.columns) for col_num, header in enumerate(headers, 1): cell ws.cell(row1, columncol_num, valueheader) # 设置表头样式加粗、居中、浅灰色背景 cell.font Font(boldTrue) cell.alignment Alignment(horizontalcenter, verticalcenter) # 可以设置简单的边框 thin_border Border(leftSide(stylethin), rightSide(stylethin), topSide(stylethin), bottomSide(stylethin)) cell.border thin_border # 3. 写入数据行 for row_num, row_data in enumerate(df.itertuples(indexFalse), 2): # 从第2行开始 for col_num, value in enumerate(row_data, 1): cell ws.cell(rowrow_num, columncol_num, valuevalue) cell.border thin_border # 为数据单元格也添加边框 # 4. 关键步骤为“完整路径超链接”列创建超链接 # 找到“完整路径超链接”列所在的列索引 hyperlink_col_index headers.index(完整路径超链接) 1 # openpyxl列索引从1开始 hyperlink_col_letter get_column_letter(hyperlink_col_index) # 获取“文件名”列的索引用于作为超链接的显示文本 filename_col_index headers.index(文件名) 1 for row_num in range(2, ws.max_row 1): # 从第2行数据开始 file_path ws.cell(rowrow_num, columnhyperlink_col_index).value file_name ws.cell(rowrow_num, columnfilename_col_index).value if file_path: # 构建file://协议的URL。注意Windows路径需要转换 # 将反斜杠替换为正斜杠并确保是绝对路径 file_url file_path.replace(\\, /) if not file_url.startswith(file://): file_url ffile:///{file_url} # 创建HYPERLINK公式。显示文本使用文件名。 hyperlink_formula fHYPERLINK({file_url}, {file_name}) # 将公式写入“完整路径”列的单元格 ws.cell(rowrow_num, columnhyperlink_col_index, valuehyperlink_formula) # 设置超链接单元格的样式蓝色带下划线 cell ws.cell(rowrow_num, columnhyperlink_col_index) cell.font Font(color0563C1, underlinesingle) # 同时可以清空或隐藏原始的“文件名”列因为超链接列已经显示了文件名 # ws.cell(rowrow_num, columnfilename_col_index, valueNone) # 5. 自动调整列宽近似值 for column in ws.columns: max_length 0 column_letter get_column_letter(column[0].column) # 获取列字母 for cell in column: try: if cell.value: # 计算单元格内容的长度 cell_length len(str(cell.value)) if cell_length max_length: max_length cell_length except: pass # 设置一个合理的列宽避免过窄或过宽 adjusted_width min(max_length 2, 50) ws.column_dimensions[column_letter].width adjusted_width # 6. 冻结首行方便浏览长列表 ws.freeze_panes A2 # 7. 保存工作簿 try: wb.save(output_file) print(f成功文件索引已保存至: {os.path.abspath(output_file)}) except PermissionError: print(f错误无法保存文件 {output_file}。请检查文件是否被其他程序如Excel打开或是否有写入权限。) except Exception as e: print(f保存文件时发生未知错误: {e})关键点说明HYPERLINK公式这是Excel的内置函数。HYPERLINK(link_location, [friendly_name])。link_location是目标地址我们使用file://协议指向本地文件friendly_name是单元格中显示的文字。file://协议这是指向本地文件系统的标准URL协议。在Windows上路径格式通常是file:///C:/Users/...注意三个斜杠。我们的代码做了自动处理。样式设置使用openpyxl.styles为表头和数据单元格设置字体、对齐方式和边框让生成的Excel更专业。自动调整列宽通过计算每列内容的最大长度来动态设置列宽提升可读性。冻结窗格ws.freeze_panes A2使得滚动表格时标题行始终可见。错误处理特别处理了PermissionError这是保存文件时最常见的错误通常是因为文件已被打开。4.4 主函数与用户交互最后我们需要一个主函数来串联整个流程并处理用户输入。def main(): 主函数协调整个流程。 print( 文件目录结构生成工具 ) print(本工具将扫描指定文件夹并生成带超链接的Excel索引文件。) # 获取用户输入的目录路径 target_dir input(请输入要扫描的文件夹完整路径可直接将文件夹拖拽到此处: ).strip().strip().strip() # 验证路径是否存在且是一个目录 if not os.path.isdir(target_dir): print(f错误路径 {target_dir} 不存在或不是一个有效的文件夹。) return # 获取用户指定的输出文件名可选 default_output file_index.xlsx output_name input(f请输入输出的Excel文件名直接回车将使用默认名称 {default_output}: ).strip() if not output_name: output_name default_output elif not output_name.endswith(.xlsx): output_name .xlsx print(f开始扫描目录: {target_dir} ...) # 步骤1扫描目录 file_list scan_directory(target_dir) print(f扫描完成共找到 {len(file_list)} 个文件。) if not file_list: print(未找到任何文件程序退出。) return # 步骤2创建DataFrame df create_dataframe(file_list) # 步骤3保存为Excel save_to_excel_with_hyperlink(df, output_name) # 提示用户 print(\n操作完成) print(f请打开生成的 {output_name} 文件。) print(在“完整路径超链接”列点击蓝色的文件名即可直接打开文件所在文件夹。) if __name__ __main__: main()5. 完整脚本与使用示例将上述所有代码块按顺序整合到一个.py文件中就得到了完整的工具脚本。以下是使用示例保存脚本将完整代码保存为generate_file_index.py。运行脚本在终端中导航到脚本所在目录执行python generate_file_index.py交互过程 文件目录结构生成工具 本工具将扫描指定文件夹并生成带超链接的Excel索引文件。 请输入要扫描的文件夹完整路径可直接将文件夹拖拽到此处: D:\MyProjects\LearningMaterials 请输入输出的Excel文件名直接回车将使用默认名称 file_index.xlsx: 我的学习资料索引.xlsx 开始扫描目录: D:\MyProjects\LearningMaterials ... 扫描完成共找到 847 个文件。 成功文件索引已保存至: C:\Users\YourName\Desktop\我的学习资料索引.xlsx 操作完成 请打开生成的 我的学习资料索引.xlsx 文件。 在“完整路径超链接”列点击蓝色的文件名即可直接打开文件所在文件夹。查看结果用Excel打开生成的.xlsx文件你会看到一个结构清晰的表格。点击“完整路径超链接”列中任意一个蓝色的文件名系统会自动弹出文件资源管理器并定位到该文件如下图所示此处为文字描述表格包含列文件名、相对路径、文件类型、文件大小(字节)、文件大小、修改时间、完整路径超链接。“完整路径超链接”列显示为蓝色带下划线的文件名点击即可跳转。可以使用Excel的筛选和排序功能例如按“文件类型”筛选所有.pdf文件或按“修改时间”排序找到最新文件。6. 进阶功能与定制化建议基础版本已经非常实用但你可以根据特定需求进行增强6.1 添加文件过滤功能只扫描特定类型的文件例如只关心图片或文档。def scan_directory_with_filter(root_dir, allowed_extensionsNone): 带过滤功能的目录扫描。 参数: root_dir (str): 根目录。 allowed_extensions (list, optional): 允许的文件扩展名列表如 [.pdf, .docx, .txt]。 为None时扫描所有文件。 file_list [] root_dir os.path.abspath(root_dir) for dirpath, dirnames, filenames in os.walk(root_dir): for filename in filenames: file_ext os.path.splitext(filename)[1].lower() # 如果指定了扩展名过滤则进行检查 if allowed_extensions and file_ext not in allowed_extensions: continue # 跳过不符合条件的文件 # ... 其余收集信息的代码与之前相同 ... # full_path, relative_path 等... file_info { full_path: full_path, relative_path: relative_path, file_name: filename, file_size: file_size, modified_time: modified_time, file_type: file_ext } file_list.append(file_info) return file_list # 在主函数中调用示例 # 只扫描PDF和Word文档 extensions [.pdf, .docx, .doc] file_list scan_directory_with_filter(target_dir, allowed_extensionsextensions)6.2 计算文件夹大小并汇总有时我们不仅需要文件列表还想知道每个子文件夹的总大小。import os from collections import defaultdict def calculate_folder_sizes(root_dir): 计算根目录下每个子文件夹的总大小。 返回一个字典键为文件夹相对路径值为总大小字节。 folder_sizes defaultdict(int) root_dir os.path.abspath(root_dir) for dirpath, dirnames, filenames in os.walk(root_dir): for filename in filenames: full_path os.path.join(dirpath, filename) try: file_size os.path.getsize(full_path) # 将文件大小累加到其所在目录及所有父目录上 rel_dir os.path.relpath(dirpath, root_dir) # 处理根目录本身 if rel_dir .: rel_dir # 累加到当前目录 folder_sizes[rel_dir] file_size # 累加到所有父目录可选如果需要层级汇总 # parts rel_dir.split(os.sep) # for i in range(len(parts)): # parent os.sep.join(parts[:i]) # folder_sizes[parent] file_size except OSError: pass return folder_sizes # 可以将文件夹大小信息作为一个新的工作表添加到Excel中 def add_folder_summary_sheet(wb, folder_sizes): 在工作簿中添加一个“文件夹大小汇总”工作表。 ws_summary wb.create_sheet(title文件夹大小汇总) ws_summary.append([文件夹路径, 总大小(字节), 总大小]) for folder_path, size_bytes in sorted(folder_sizes.items()): if folder_path : # 根目录 folder_path (根目录) size_formatted format_file_size(size_bytes) ws_summary.append([folder_path, size_bytes, size_formatted]) # 设置样式...6.3 集成到右键菜单Windows进阶对于Windows用户可以将脚本封装成.exe或.bat并添加到资源管理器的右键菜单中实现“右键点击文件夹 - 生成索引”的极致便捷。创建批处理文件generate_index_here.bat:echo off python C:\path\to\your\generate_file_index.py pause修改Python脚本使其接收命令行参数而不是交互式输入import sys # ... 其他代码 ... def main(): if len(sys.argv) 1: target_dir sys.argv[1] else: target_dir input(请输入要扫描的文件夹完整路径: ).strip() # ... 其余代码 ...修改批处理文件以传递参数echo off python C:\path\to\your\generate_file_index.py %1 pause通过修改Windows注册表将上述.bat文件添加到文件夹的右键菜单中此操作需谨慎建议先备份注册表。网络上有很多关于“添加右键菜单”的教程核心是操作HKEY_CLASSES_ROOT\Directory\shell和HKEY_CLASSES_ROOT\Directory\Background\shell键。7. 常见问题与排查思路在实际使用中你可能会遇到一些问题。以下是常见问题的排查指南问题现象可能原因排查方式解决方案运行脚本时报ModuleNotFoundError未安装pandas或openpyxl库。查看错误信息中缺失的模块名。在终端执行pip install pandas openpyxl。扫描速度非常慢1. 扫描的目录包含海量文件如数十万。2. 目录中存在大量无法访问的链接或网络路径。观察脚本打印的进度或尝试扫描一个小型目录对比。1. 添加文件类型过滤减少扫描量。2. 使用try...except跳过无法访问的路径代码中已实现。3. 考虑使用多线程扫描复杂度较高。生成的Excel文件打开后超链接无法点击/报错1.file://URL格式不正确。2. 文件路径包含特殊字符或空格未正确转义。3. Excel安全设置阻止了超链接。检查Excel中某个超链接单元格的公式。例如路径中的空格是否被正确包裹在引号中。1. 确保代码中路径转换正确replace(\\, /)。2. 在构建hyperlink_formula时对file_url使用repr()或手动添加引号转义。3. 在Excel中检查“文件 - 选项 - 信任中心 - 信任中心设置 - 外部内容”确保允许。点击超链接只打开文件夹没有高亮文件file://协议在部分系统或Excel版本中的行为差异。对比手动在浏览器地址栏输入file:///完整路径的行为。这是系统资源管理器的行为通常能打开所在文件夹即算成功。高亮文件可能依赖特定系统设置。可以尝试在路径末尾添加参数非通用方法。生成的Excel文件很大扫描的文件数量极多数万行。查看Excel文件属性。1. 考虑分批次扫描或按子文件夹生成多个文件。2. 在save_to_excel_with_hyperlink函数中可以尝试使用openpyxl的write_only模式优化内存但对公式支持有限。在macOS或Linux上运行超链接不工作file://协议路径格式不同。检查生成的公式macOS/Linux路径应以file://开头后接绝对路径如file:///Users/name/file。修改file_url的生成逻辑使其兼容不同操作系统。可以使用pathlib库进行更优雅的路径处理。“完整路径”列显示的是公式文本不是超链接Excel可能将单元格格式设置为“文本”或者公式未被正确识别。选中该单元格查看编辑栏。如果显示的是HYPERLINK(...)但无链接效果可能是格式问题。1. 在代码中确保单元格的value设置的是以开头的公式字符串而不是普通文本。2. 在Excel中全选该列将单元格格式设置为“常规”。8. 最佳实践与工程建议将这个脚本用于个人或团队生产环境时遵循以下建议可以避免很多麻烦路径规范化始终使用os.path.abspath()和os.path.normpath()处理输入路径避免因.、..或混合斜杠导致的问题。异常处理与日志在生产脚本中应将print语句替换为更健壮的日志模块如logging记录扫描开始、结束、文件数量、错误等信息便于排查。性能考量对于超大型目录10万文件递归扫描os.walk可能较慢。可以考虑使用scandirPython 3.5 的os.scandir它比os.listdir性能更好。输出文件管理避免每次生成的文件覆盖之前的。可以在输出文件名中加入时间戳如file_index_20231027_143022.xlsx。import time timestamp time.strftime(%Y%m%d_%H%M%S) output_file ffile_index_{timestamp}.xlsx安全边界此脚本会读取文件系统的元数据。确保不要在有严格权限限制或包含敏感信息的目录上随意运行。可以考虑添加一个确认步骤或在扫描前列出将要扫描的顶级目录。代码可配置化将“是否包含隐藏文件”、“是否跟随符号链接”、“需要跳过的目录名列表”如__pycache__,.git等作为函数参数或配置文件项提高脚本的灵活性。版本控制将脚本本身纳入你的版本控制系统如Git方便迭代和回滚。通过以上步骤你不仅得到了一个实用的文件目录索引生成工具更掌握了一套将日常重复性手工操作自动化、工具化的思路。这个模式可以复用到很多场景批量重命名、图片元信息提取、日志文件分析等等。核心在于明确痛点 - 拆解流程 - 选择合适的技术栈 - 实现并优化 - 处理边界情况。下次当你或你的团队再面对一堆杂乱的文件时不妨运行一下这个脚本。几分钟后一个清晰、可操作、带超链接的资源台账就会出现在你面前。这节省的不仅仅是时间更是梳理信息和高效协作的认知成本。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻