最稳合并TXT文件需显式指定encoding='utf-8'、用'a'模式追加写入、每行手动加'\n',避免乱码、粘连和清空;大文件须逐行读取,路径用pathlib保障跨平台兼容。

用 open() 逐个读取再写入,最稳
合并 TXT 文件本质就是「读一个、追加一个」,不用第三方库也能搞定,而且可控性高。关键不是快,是不丢内容、不乱码、不崩。
常见错误现象:UnicodeDecodeError: 'gbk' codec can't decode byte(Windows 默认用 gbk 打开,但文件可能是 utf-8);或者合并后换行消失(忘了加 \n)。
- 始终显式指定
encoding='utf-8',如果不确定编码,先用chardet检测,或统一用errors='ignore'容错(慎用于生产) - 输出文件用
mode='a'(追加)比'w'更安全,避免中途出错清空已有内容 - 每读完一个文件的
line,手动加\n,别依赖原文件末尾是否有换行——很多编辑器保存时不加结尾换行,会导致下个文件内容粘连
with open('output.txt', 'w', encoding='utf-8') as out_f:
for file in ['a.txt', 'b.txt', 'c.txt']:
with open(file, 'r', encoding='utf-8') as f:
for line in f:
out_f.write(line.rstrip('\n') + '\n')
用 pathlib 批量找文件,比 os.listdir 直观
要合并当前目录下所有 .txt,或按规则匹配(如 log_*.txt),pathlib 写起来更少出错,路径拼接不会漏斜杠,也天然支持 glob。
使用场景:文件分散在子目录、需要按时间排序、排除临时文件(如 *.tmp)。
-
Path('.').glob('*.txt')不递归;要递归用rglob() - 结果是生成器,直接
sorted()可按字母序排,加key=os.path.getmtime能按修改时间排(需 importos) - 注意
glob返回的是Path对象,不是字符串,传给open()前不用转str()(Python 3.6+ 支持)
大文件合并时别用 read() 全加载进内存
单个文件几百 MB 以上,用 f.read() 或 f.readlines() 容易爆内存,尤其脚本跑在低配机器或 Docker 容器里。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
性能影响:1GB 文件调 read() 会瞬间吃掉 1GB+ 内存,而逐行 for line in f 内存占用基本恒定在几 KB。
- 绝对不要写
content = f.read(); out_f.write(content) - 即使想跳过空行或过滤,也用生成器表达式:
(line for line in f if line.strip()),别先全读进 list - 如果真要替换内容(如删掉某列),用
csv模块或pandas更可靠,纯文本正则替换容易误伤
Windows 下路径和换行符容易被忽略
脚本在 Windows 写,在 Linux 服务器上跑,或反过来,会因换行符(\r\n vs \n)和路径分隔符(\ vs /)出问题,但报错不明显——文件能合并,但下游程序读不了。
兼容性影响:Git 默认把 \n 存成 \r\n,某些日志分析工具只认 \n;os.path.join() 在 Windows 返回 \,但很多命令行工具(如 grep)只认 /。
- 写入时统一用
\n(Python 的print(..., end='\n')或.write(... + '\n')自动处理) - 路径一律用
pathlib.Path,它内部自动适配系统分隔符,str(p)输出才带斜杠 - 如果最终要给 shell 工具用,用
shlex.quote(str(p))包裹路径,防空格和特殊字符
实际跑起来最常卡住的点,是编码判断和换行控制——不是语法不会,而是默认行为和预期不一致。多试两个真实文件,比看十遍文档管用。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










