最稳妥的文件合并方式是用 open() 逐个读写并显式指定 encoding,避免编码不一致、换行符混乱和内存溢出;需跳过 BOM(或用 utf-8-sig)、排序文件名、规范化路径。

直接用 open() 逐个读取再写入最稳妥,别碰 shutil.copyfileobj() 或管道类操作——容易丢编码、截断或静默失败。
用 open() 按顺序读写,显式控制编码
多数合并失败源于编码不一致或换行符混乱。必须统一指定 encoding,且避免用 readlines() 加载整文件到内存(大文件会崩)。
- 用
with open(...)确保每个文件都正确关闭 - 目标文件用
mode='w'(不是'a'),避免重复追加 - 每读完一个源文件,手动写入一个换行符
'\n',防止内容粘连 - 示例:
with open('merged.txt', 'w', encoding='utf-8') as out: for fname in ['a.txt', 'b.txt', 'c.txt']: with open(fname, 'r', encoding='utf-8') as f: for line in f: out.write(line) out.write('\n')
处理含 BOM 的 UTF-8 文件时跳过开头字节
Windows 记事本保存的 UTF-8 文件常带 BOM(b'\xef\xbb\xbf'),若不跳过,合并后首行会出现乱码 。
- 检测并跳过:读取前 3 字节,如果是 BOM 就
f.seek(3) - 更简单做法:统一用
encoding='utf-8-sig',Python 会自动剥离 BOM - 注意:
utf-8-sig只影响读取;写入时不会加 BOM,如需保留 BOM,写入用encoding='utf-8-sig'并手动写入'\ufeff'
按文件名排序后再合并,避免无序拼接
用 glob.glob('*.txt') 或 os.listdir() 得到的文件列表不保证顺序,尤其在 Linux/macOS 下是字典序,Windows 资源管理器显示顺序≠实际顺序。
立即学习“Python免费学习笔记(深入)”;
- 务必用
sorted()排序,例如sorted(glob.glob('log_*.txt')) - 若文件名含数字(如
part1.txt,part10.txt),用natsort库或正则提取数字排序,否则part10.txt会排在part2.txt前 - 命令行快速验证顺序:
python -c "import glob; print(sorted(glob.glob('*.txt')))"
真正麻烦的不是读写逻辑,而是路径中混着相对路径、中文名、空格或符号——建议所有文件路径先用 pathlib.Path.resolve() 规范化,再传给 open()。否则在某些 shell 环境下,open('data/日志.txt') 可能报 FileNotFoundError 而不提示编码问题。


















