【R|Python】一般没用的技能:统计指定路径下各子文件夹占用空间
·
我发现R包占用空间太多,想知道library文件夹下:每个一级子目录分别占用了多少磁盘空间?
以下分别给出 Python 和 R 的实现方式
一:Python(pathlib + pandas)
核心思路
- 使用
pathlib.Path遍历目标路径下的 一级子目录 - 对每个子目录递归查找所有文件
- 累加文件大小(字节)
- 使用
pandas整理为表格,并转换为 MB 排序
Python 代码
from pathlib import Path
import pandas as pd
path = Path(r"E:\R_Program\R-4.4.1\library")
rows = [
{
"package": p.name,
"size_bytes": sum(
f.stat().st_size
for f in p.rglob("*")
if f.is_file()
)
}
for p in path.iterdir()
if p.is_dir()
]
df = (
pd.DataFrame(rows)
.assign(size_MB=lambda x: x.size_bytes / 1024**2)
.sort_values("size_MB", ascending=False)
)
df.head(10)

代码解读
1. 遍历一级目录
for p in path.iterdir() if p.is_dir()
iterdir():只遍历 当前路径的一级内容is_dir():确保只统计文件夹(而非单个文件)
这一步保证了统计对象是 每个 R 包目录,而不是递归子目录本身。
2. 递归统计文件大小
sum(f.stat().st_size for f in p.rglob("*") if f.is_file())
rglob("*"):递归获取目录下的所有内容f.is_file():只统计文件,排除子目录f.stat().st_size:返回文件大小(字节)
这是 Python 版本的核心计算逻辑。
3. 使用 pandas 进行整理
.assign(size_MB=lambda x: x.size_bytes / 1024**2)
.sort_values("size_MB", ascending=False)
- 字节 → MB
- 按大小降序排列
- 非常适合后续筛选“最占空间的包”
二:R(base R)
核心思路
- 使用
list.dirs()获取一级子目录 - 对每个子目录:
- 列出所有文件
- 使用
file.info()获取大小 - 累加并转换为 MB
- 整理为 data.frame
R 代码
path <- "E:/R_Program/R-4.4.1/library"
# 只取一级目录
libs <- list.dirs(
path,
recursive = FALSE,
full.names = TRUE
)
# 计算每个包目录的总大小(MB)
lib_size <- sapply(libs, function(d) {
files <- list.files(
d,
recursive = TRUE,
full.names = TRUE
)
sum(file.info(files)$size, na.rm = TRUE) / 1024^2
})
res <- data.frame(
pak = libs,
size_MB = lib_size
)
head(res,10)

代码解读
1. 获取一级目录
list.dirs(path, recursive = FALSE, full.names = TRUE)
recursive = FALSE:只返回一级子目录full.names = TRUE:保留完整路径,便于后续文件访问
这一步与 Python 中 path.iterdir() 的作用完全对应。
2. 递归列出文件并统计大小
files <- list.files(d, recursive = TRUE, full.names = TRUE)
sum(file.info(files)$size, na.rm = TRUE)
list.files(..., recursive = TRUE):获取目录下所有文件file.info(files)$size:返回文件大小(字节)na.rm = TRUE:防止权限或软链接导致的 NA 中断
3. 转换为 MB
/ 1024^2
保持与 Python 结果单位一致,便于对照。
R 方法特点
- 纯 base R,无需额外依赖
- 对 R 用户直观
- 适合直接嵌入分析脚本或维护脚本中
Python 与 R 实现对比
| 方面 | Python | R |
|---|---|---|
| 路径处理 | pathlib 面向对象 |
字符串 + base 函数 |
| 递归方式 | rglob("*") |
list.files(recursive=TRUE) |
| 表格整理 | pandas |
data.frame |
| 扩展性 | 强(可直接可视化/导出) | 简洁,依赖少 |
| 适用场景 | 跨语言/数据工程 | R 环境维护 |
实践注意事项
- R library 中可能包含:
- 二进制文件(
.dll,.so) - 编译缓存
- vignette / help 文档
因此某些包(如rstan,terra,Seurat)体积明显偏大是正常现象。
- 二进制文件(
- Windows 路径建议统一使用:
- Python:
Path(r"...") - R:正斜杠
/或双反斜杠\\
- Python:
更多推荐
所有评论(0)