51 CTO 博客:https://blog.51cto.com/13969817
作为SharePoint 的管理员,在管理 SharePoint Online 文档库时,了解文件的分布和大小信息通常非常有用。
本文将介绍如何使用命令行工具和 Python 脚本统计 SharePoint Online 中的文件路径和大小,帮助管理员更好地管理和优化文档存储。
在开始之前,需要准备以下内容:
- Python 3.7 或更高版本
- SharePoint Online 站点的访问权限
- 安装必要的Python 库:office365-rest-python-client
我们将通过 SharePoint 的 REST API 来获取文档库中的文件信息,具体步骤如下:
- 连接到 SharePoint Online 站点
- 递归遍历文档库中的所有文件夹
- 收集每个文件的路径和大小信息
- 将结果输出到控制台和CSV 文件
下面是完整的 Python 脚本,可用于统计 SharePoint Online 文件信息:
import argparse
import csv
from office365.runtime.auth.user_credential import UserCredential
from office365.sharepoint.client_context import ClientContext
import os
def connect_to_sharepoint(site_url, username, password):
"""连接到SharePoint Online站点"""
try:
ctx = ClientContext(site_url).with_credentials(UserCredential(username, password))
# 验证连接
web = ctx.web
ctx.load(web)
ctx.execute_query()
print(f"成功连接到 SharePoint 站点: {web.title}")
return ctx
except Exception as e:
print(f"连接 SharePoint 失败: {str(e)}")
return None
def get_files_in_folder(ctx, folder_url, files_list, base_path=""):
"""递归获取文件夹中的所有文件"""
try:
folder = ctx.web.get_folder_by_server_relative_url(folder_url)
ctx.load(folder)
ctx.execute_query()
# 获取当前文件夹路径
current_path = os.path.join(base_path, folder.properties["Name"])
# 获取文件夹中的文件
files = folder.files
ctx.load(files)
ctx.execute_query()
for file in files:
# 收集文件信息
file_info = {
"name": file.properties["Name"],
"path": current_path,
"full_path": os.path.join(current_path, file.properties["Name"]),
"size_bytes": file.properties["Length"],
"size_mb": round(file.properties["Length"] / (1024 * 1024), 2) if file.properties["Length"] else 0
}
files_list.append(file_info)
print(f"发现文件: {file_info['full_path']} ({file_info['size_mb']} MB)")
# 递归处理子文件夹
sub_folders = folder.folders
ctx.load(sub_folders)
ctx.execute_query()
for sub_folder in sub_folders:
# 跳过特殊文件夹
if sub_folder.properties["Name"] not in ["Forms"]:
get_files_in_folder(ctx, sub_folder.properties["ServerRelativeUrl"], files_list, current_path)
except Exception as e:
print(f"处理文件夹 {folder_url} 时出错: {str(e)}")
def save_to_csv(files_list, output_file):
"""将文件信息保存到CSV文件"""
try:
with open(output_file, mode='w', newline='', encoding='utf-8') as file:
writer = csv.DictWriter(file, fieldnames=["name", "path", "full_path", "size_bytes", "size_mb"])
writer.writeheader()
for item in files_list:
writer.writerow(item)
print(f"文件信息已保存到 {output_file}")
except Exception as e:
print(f"保存CSV文件失败: {str(e)}")
def print_summary(files_list):
"""打印统计摘要"""
if not files_list:
print("未找到任何文件")
return
total_files = len(files_list)
total_size_bytes = sum(file["size_bytes"] for file in files_list)
total_size_mb = round(total_size_bytes / (1024 * 1024), 2)
total_size_gb = round(total_size_mb / 1024, 2)
print("\n===== 统计摘要 =====")
print(f"总文件数: {total_files}")
print(f"总大小: {total_size_bytes} 字节")
print(f"总大小: {total_size_mb} MB")
print(f"总大小: {total_size_gb} GB")
# 最大的5个文件
largest_files = sorted(files_list, key=lambda x: x["size_bytes"], reverse=True)[:5]
print("\n最大的5个文件:")
for i, file in enumerate(largest_files, 1):
print(f"{i}. {file['full_path']} - {file['size_mb']} MB")
def main():
# 解析命令行参数
parser = argparse.ArgumentParser(description='统计SharePoint Online文档库中的文件路径和大小')
parser.add_argument('--site-url', required=True, help='SharePoint站点URL')
parser.add_argument('--username', required=True, help='SharePoint登录用户名')
parser.add_argument('--password', required=True, help='SharePoint登录密码')
parser.add_argument('--library', required=True, help='文档库名称')
parser.add_argument('--output', default='sharepoint_files.csv', help='输出CSV文件路径')
args = parser.parse_args()
# 连接到SharePoint
ctx = connect_to_sharepoint(args.site_url, args.username, args.password)
if not ctx:
return
# 获取文档库根目录
library_url = f"/sites/{args.site_url.split('/sites/')[1]}/{args.library}" if "/sites/" in args.site_url else f"/{args.library}"
# 收集文件信息
files_list = []
print(f"开始扫描 {args.library} 文档库...")
get_files_in_folder(ctx, library_url, files_list)
# 保存结果并打印摘要
save_to_csv(files_list, args.output)
print_summary(files_list)
if __name__ == "__main__":
main()
使用方法
使用命令行运行脚本,需要提供以下参数:
python sharepoint_file_stats.py --site-url "https://your-tenant.sharepoint.com/sites/your-site" --username "your-email@domain.com" --password "your-password" --library "Documents" --output "file_stats.csv"
参数说明:
- --site-url:SharePoint 站点的完整
- --username: 用登录的用户名(通常是邮箱)
- --password:登录密码(如果启用了MFA,可能需要使用应用密码)
- --library:要统计的文档库名称
- --output: 输出 CSV 文件的路径(可选,默认是 sharepoint_files.csv)
代码解析
- 连接SharePoint:使用office365-rest-python-client库建立与SharePoint Online 的连接,验证用户凭据
- 递归遍历文件:get_files_in_folder函数递归遍历文档库中的所有文件夹和文件,收集文件的名称、路径和大小信息
- 数据处理:将收集到的文件信息保存到CSV 文件,并生成统计摘要,包括总文件数、总大小和最大的 5 个文件
- 命令行接口:使用argparse库处理命令行参数,使脚本更易于使用
注意事项:如果你的 SharePoint 环境启用了多因素认证(MFA),直接使用密码可能无法登录,此时需要创建应用密码或使用其他认证方式
通过这个脚本,你可以快速获取 SharePoint Online 文档库的文件统计信息,有助于进行存储管理、清理不必要的大文件,以及了解文件分布情况。