优先用 glob.glob() 批量匹配文件路径,避免 os.listdir + 字符串过滤;合并时用 shutil.copyfileobj 流式处理,显式排序确保顺序,并为每个文件添加 try/except 防错。

用 glob 批量获取文件路径,别用 os.listdir + 字符串过滤
直接遍历目录再手动筛选后缀(比如 if f.endswith('.txt'))在上千个文件时明显变慢,因为 os.listdir 返回全部条目,Python 层还要逐个判断。而 glob.glob('*.txt') 由系统或 shell 级完成匹配,底层更轻量,尤其在 Linux/macOS 上能跳过非匹配项。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 优先用
glob.glob('data/*.txt'),路径中尽量带通配符,避免无谓遍历 - 如果文件名有规律但不统一(如
log_001.txt到log_999.txt),用glob.glob('log_[0-9][0-9][0-9].txt')比正则快得多 - Windows 下注意路径分隔符,统一用
pathlib.Path或os.path.join拼接,别硬写'data\*.txt'
合并时跳过 open() 频繁调用,改用 shutil.copyfileobj
常见错误是循环里对每个小文件都 open(...).read() 再拼字符串——这会把所有内容加载进内存,还触发上千次 I/O 打开/关闭。实际只需流式搬运字节块。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
with open('output.txt', 'wb') as out_f:单次打开输出文件 - 对每个输入文件,用
with open(f, 'rb') as in_f:打开后,直接shutil.copyfileobj(in_f, out_f) -
shutil.copyfileobj默认 64KB 缓冲区,足够应付微小文件;不用改length参数 - 避免
.read().decode()或.encode(),除非明确要转编码——纯文本合并保持二进制模式最稳
按顺序合并?小心 glob 返回的路径无序
glob.glob() 不保证顺序,Linux 下常按 inode 排,macOS 可能按字典序,Windows 更不确定。上千个日志或分片文件若依赖顺序(如 part_1.txt, part_2.txt),必须显式排序。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 别信默认顺序,一律加
sorted(glob.glob('part_*.txt')) - 如果文件名含数字但有前导零问题(
part_1.txtvspart_10.txt),用sorted(paths, key=lambda x: int(re.search(r'part_(\d+).txt', x).group(1))) - 更健壮的做法:提取数字部分排序,而非依赖字符串比较
合并失败时,别让整个流程崩掉——用 try/except 包裹单个文件
上千个文件里混入损坏、权限不足或编码异常的文件很常见。用一个 try/except 包住整个循环,只会跳过第一个出错文件就终止;必须粒度细化到每个 open。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 在读取每个文件的
with open(...)外层加try/except OSError(覆盖权限、不存在、磁盘错误) - 如果担心编码问题(如某几个文件是 GBK),捕获
UnicodeDecodeError并记录警告,而不是中断 - 用
print(f'⚠️ 跳过 {f}: {e}')或写入日志文件,否则失败静默,你根本不知道漏了哪几个
真正卡点不在“怎么合”,而在“合得稳不稳”——路径乱序、编码混杂、个别文件损坏,这些细节比合并逻辑本身更容易导致结果不可用。

















