应先用 os.path.getsize() 获取文件大小再决定是否拆分;例如指定每片1mb但文件仅500kb时无需拆分,避免生成冗余碎片或空文件报错。

用 os.path.getsize() 预判文件是否真需要拆分
直接开拆前先看一眼文件大小,避免对小文件做无谓操作。比如你指定每片 1MB,但源文件才 500KB,那根本不用拆——os.path.getsize() 能秒级拿到字节数,比读内容快得多。
常见错误是跳过这步,结果生成一个和原文件一模一样的“碎片”,还多出一个空文件或报错。
- 用
os.path.getsize("input.txt")获取原始字节数 - 若
file_size ,直接返回单个路径,不创建新文件 - 注意:Windows 下某些编辑器(如记事本)保存的文本末尾可能带 BOM 或换行符,实际字节数≠字符数,以字节为准
按字节切分而非按行,用 open(..., "rb") + read(chunk_size)
按行切容易导致某一片突然变大(比如一行就几 MB 的日志),也不保证每片严格等于目标大小。按字节切最可控,且 Python 的 read() 在二进制模式下天然支持精确截断。
关键点在于:必须用 "rb" 模式打开源文件,否则在 Windows 上遇到 \r\n 可能引发长度偏差;目标碎片也建议用 "wb" 写入,避免编码干扰。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 不要用
readlines()或for line in f:—— 它们会预读、缓冲、破坏字节边界 -
f.read(chunk_size)返回bytes,长度即真实字节数,空 bytes 表示 EOF - 每次写完一片后检查
len(data) ,这是最后一片,别漏掉
命名与路径控制:避免覆盖、支持中文路径、预留序号位
碎片文件名不能简单叫 part1、part2,否则 10 片以上排序错乱(part10 排在 part2 前)。同时,Python 默认支持 UTF-8 路径,但需确保终端/IDE 编码一致,否则中文路径报 UnicodeEncodeError。
- 推荐格式:
f"output_{i:04d}.bin"(4 位补零,最多 9999 片) - 输出目录建议用
os.makedirs(out_dir, exist_ok=True)预创建,防止因路径不存在而中断 - 如果源文件是
/data/log.txt,别把碎片默认写进/data/——容易混淆,显式指定out_dir="chunks/"
处理超大文件时的内存与性能提醒
用 read(chunk_size) 是流式读取,内存占用恒定(只存当前块),哪怕 10GB 文件也不会爆内存。但如果你误用了 read() 一次性加载全量,那就立刻 OOM。
另一个易忽略点:频繁 open/write 小文件(如每片 1KB)会导致 I/O 性能骤降,尤其在机械硬盘或网络存储上。建议最小碎片不低于 64KB,除非业务强要求。
- 实测:100MB 文件切 1MB 片,耗时约 0.3 秒(SSD);切 1KB 片则升至 4+ 秒
- 不建议在循环里用
with open(...) as f:频繁开关文件句柄,改用单次 open + seek(但字节切分无需 seek) - 如果后续要合并,记住碎片必须严格按序号顺序 cat / copy,任何一片缺失或错序都会导致数据损坏
len(data) > 0 显式判断并写出。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










