Python 用 os.path.getsize() 获取文件字节数最直接,但对符号链接默认返回链接自身大小;需用 os.path.realpath() 解析真实路径,路径不存在或无权限时抛 OSError。

Python 中用 os.path.getsize() 读取文件大小最直接
它返回字节数,不触发额外 I/O,也不依赖文件是否打开——只要路径存在且有读权限就行。
- 注意
os.path.getsize()对符号链接默认返回链接本身大小(通常几十字节),不是目标文件大小;需先用os.path.realpath()解析真实路径 - 如果路径不存在或无权限,会抛出
OSError,不是FileNotFoundError单独捕获,建议统一用try/except OSError - Windows 下对某些系统文件(如
C:\pagefile.sys)可能因权限不足报错,即使管理员身份运行也不一定绕过
Linux/macOS 终端里 ls -lh 看的是“人类可读”大小,但别误以为是精确值
ls -lh 显示的 4.2K、1.3G 是四舍五入后的近似值,底层仍是字节,但做了单位换算和保留一位小数处理。
- 真正要脚本化获取精确字节,得用
stat -c "%s" file(Linux)或stat -f "%z" file(macOS),两者格式参数不同,跨平台脚本必须分支判断 -
du -b file看的是磁盘占用字节数,受文件系统块大小影响,可能比stat结果大;普通场景该用stat,不是du - 管道传入文件名时,
ls和stat都不支持空格路径安全传递,带空格得用find ... -print0 | xargs -0 stat
JavaScript 浏览器环境不能直接读本地文件大小,得靠 File API
用户没选中文件前,JS 没法访问磁盘路径,所谓“读取文件大小”只能发生在 <input type="file"> 触发后。
-
input.files[0].size返回字节数,是只读属性,不需要 FileReader 加载内容就能拿到 - 如果用户多选,
input.files是FileList,不是数组,不能直接用map,得转成数组再操作:Array.from(input.files).map(f => f.size) - 注意
input.files是实时更新的,但事件监听必须绑在change上,click或focus拿不到新值
Node.js 里 fs.statSync() 比 fs.promises.stat() 更适合简单同步场景
虽然异步是 Node 的推荐范式,但若只是启动时读几个配置文件大小做校验,同步调用反而更清晰,避免 await 泛滥和错误处理嵌套。
-
fs.statSync(path).size抛出的是Error类型异常,不是特定子类,无法靠instanceof精准区分“不存在”和“权限拒绝”,得检查err.code(如'ENOENT'、'EACCES') - 使用
fs.promises.stat()时,catch块里err.code同样有效,但要注意 Promise 链中错误不会自动终止后续then,得显式return或用try/catch包裹await - 大目录下频繁调用
stat可能成为瓶颈,此时应缓存结果,或改用fs.readdir+ 批量stat并行(控制并发数,别无脑Promise.all)
实际读文件大小这事,核心就一条:别把“显示”当“计算”。显示可以四舍五入、可以省略单位、可以缓存;但程序逻辑里用到的大小值,必须明确来源是 stat 还是 du,是字节还是块,否则上线后磁盘告警阈值错位、上传限制失效,都是悄无声息的坑。










