按行分割用 readline() 更安全,避免 MemoryError;按字节分割需对齐换行符以防断行;shutil.copyfileobj() 适合不保行完整的快速分卷;split 命令更高效可靠;切完须校验总行数或哈希值。

按行数分割大文件时,readline() 比 readlines() 更安全
直接用 readlines() 读取 GB 级文件会触发 MemoryError,因为它是把全部行一次性加载进内存。实际应逐行读、边读边写。
- 用
for line in f:或f.readline()控制流,内存占用恒定(约几十 KB) - 每累计
n行就关闭当前输出文件、打开下一个,文件名可带序号,如part_001.txt - 注意最后一块可能不足
n行,别漏写 - 若原文件含空行或超长行,
line.strip()不影响计数,但会影响内容——是否要去除换行符需按需决定
按字节数分割必须避免在行中间断开
单纯按字节切(如每 10MB 切一刀)会导致某一行被劈成两半,后续处理时出错。必须“找最近的换行符”对齐。
- 用
f.tell()记录当前位置,f.seek(offset)跳转,配合f.readline()向后搜索第一个\n - 更稳妥的做法:每次读一块(如 8192 字节),用
bytes.rfind(b'\n')找最后一个换行位置,再切分 - 二进制模式(
'rb'/'wb')下操作更可控;文本模式自动处理换行符,反而干扰字节定位 - Windows 的
\r\n和 Unix 的\n都会被readline()正确识别,但手动搜\n就够用
shutil.copyfileobj() 适合纯字节搬运,但不保行完整
如果只是拆日志归档、备份分卷等不要求单行完整的场景,shutil.copyfileobj() 是最快方式,内部用缓冲区循环读写,比 Python 循环快 3–5 倍。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 示例:
with open('big.log', 'rb') as src: for i in range(10): with open(f'part_{i:03d}.log', 'wb') as dst: shutil.copyfileobj(src, dst, 1024*1024) # 每次搬 1MB - 它不关心内容,只管搬字节,所以第
i个文件末尾大概率是半行 - 适合后续用
cat或zcat合并回原始文件的场景,不适合直接给 pandas 或 awk 处理 - 注意:最后一次调用前要检查
src.read(1)是否为空,否则可能多生成一个空文件
用 split 命令快速验证或替代 Python 脚本
Linux/macOS 下,split 命令比写脚本更快,且经过长期优化,边界处理可靠。
立即学习“Python免费学习笔记(深入)”;
- 按行:
split -l 100000 big.log part_→ 每 10 万行一个文件,命名如part_aa - 按字节(对齐行):
split -C 10M --additional-suffix=.log big.log part_,-C会自动找换行符对齐 - 加
--verbose可看切分详情;split --help查参数,不同系统略有差异(macOS 的gsplit功能更全) - Windows 用户可用 WSL,或安装 CoreUtils for Windows;不建议用 PowerShell 的
Get-Content分块——它默认全读入内存
真正难的不是“怎么切”,而是“切完怎么验”。比如按 50 万行切,最后一个小文件只有 12 行,你得确认这是原始文件结尾,而不是程序提前退出导致漏写。建议切完立刻用 wc -l 校验总行数,或用 md5sum 对比合并后的文件与原文件。

















