资讯动态

合并TXT文件全攻略:命令行与Python脚本解决编码乱码和排序难题

发布时间:2026/10/14 11:01:03 来源:尧图企业网站定制
1. 场景盘点与方案选型思路先说个最常见的场景。某开发者跟我说他整理完一套电子书手里是几十个按章节拆开的txt文件从“第1章”一直到“第48章”分散在三个文件夹里。他要的很简单把这些碎片拼成一本完整的书。但合并txt文件这个需求难点从来不在“合并”本身而在于合并完之后内容是不是对的。如果你也遇到过类似情况比如攒了一堆日志片段要拼成一个完整日志、从不同网页复制保存了一堆草稿要汇总、或者从某些设备导出的字幕文件需要拼合——那你来对地方了。这篇文章覆盖的命令行手段、脚本方案和踩坑记录基本能解决99%的txt合并需求。先说清楚几个基本概念因为后面对话的前提都建立在它们上面。所谓“合并txt”核心要处理三件事顺序对不对。合并后的内容必须按你预期的顺序排列不是任由工具随机拼接。编码统一不统一。txt文件最常见的编码是UTF-8和GBK以及UTF-8带BOM和UTF-8不带BOM的差别编码不一致时合并后必然出现乱码。边界处理。两个txt拼接处是否需要换行分隔是紧贴在一起还是中间空一行这涉及合并后文档结构的可读性。这三件事看起来简单但很多人第一次合并时就栽在第二件和第三件上尤其是遇到中文场景。为什么因为Windows记事本早期默认用ANSI也就是GBK保存txt后来Windows 10 1903以后默认改成了UTF-8。于是你手头的文件大概率是“新老混装”的直接合并必出问题。方案选型上我的习惯是临时一次性的合并用系统自带命令几秒钟搞定需要反复执行、或者文件数量很多、需要严控顺序的场景就上脚本Windows用批处理或PowerShell跨平台就用Python。别一上来就装软件这个需求几十年来系统自带工具就已经能覆盖大部分场景自己动手还能顺便把原理搞清楚。提示任何合并操作之前先找个备份目录把原始文件复制一份。不要问为什么这是合并文件的第一铁律。2. 系统自带工具的轻量合并方案2.1 Windows下copy命令的合并玩法Windows自带的copy命令支持把多个文件拼接成一个文件这是最简单、最原始的方式。基本语法copy 文件1.txt文件2.txt文件3.txt 合并结果.txt注意这里的号它在copy命令里表示“追加拼接”不是算术运算。执行完以后合并结果.txt里的内容就是文件1、文件2、文件3依次排列。如果目标文件已经存在系统会问你是否覆盖这个细节新手容易懵加一个 /y 参数就能跳过询问copy /y 文件1.txt文件2.txt文件3.txt 合并结果.txt还有一个参数值得记/b。它的作用是“以二进制模式复制”不加这个参数时copy命令遇到文件里的特殊控制字符尤其是CtrlZASCII码26可能会提前停止读取。很多txt文件虽然是文本但不排除里面混入了这类字符。加上 /b 后可以避免半路截断的问题。实测下来处理下载的电子书或网页另存的txt时加上/b会更稳copy /y /b 文件1.txt文件2.txt文件3.txt 合并结果.txt有人问文件特别多时能不能用通配符比如copy /y /b *.txt 合并结果.txt能用但风险很大。一是顺序完全不受控系统按文件系统枚举顺序拼接不一定是你要的顺序二是合并结果.txt本身也匹配*.txtcopy命令执行时可能把自身也读进去导致内容无限增长或出现“文件正被使用”的报错。我见过有人合并后文件越搞越大就是这个原因。所以通配符方案只适合文件名天然有序、且输出文件放在别的目录、或者故意用别的扩展名的场景不建议当作通用手法。2.2 Windows下PowerShell的灵活合并PowerShell是Windows上更现代的合并工具语法比copy命令清晰对编码的控制也好很多。最基础的写法Get-Content 文件1.txt, 文件2.txt | Out-File 合并结果.txt -Encoding UTF8Get-Content会把多个文件的内容依次读进来管道交给Out-File写出去。这里有个关键细节Get-Content读文件时是按行读的每一行是一个字符串对象。默认情况下如果文件最后一行没有换行符两个文件拼接处就可能出现“文件1最后一行和文件2第一行黏在一起”的情况。解决办法是给Get-Content加参数-Encoding并提前给输出留一个换行或者用Get-Content 文件1.txt, 文件2.txt | Set-Content 合并结果.txt -Encoding UTF8如果要合并的是一整个目录下按规则排列的文件PowerShell可以这样写$files Get-ChildItem D:\data\*.txt | Sort-Object Name Get-Content $files | Out-File D:\data\merged.txt -Encoding UTF8Sort-Object Name默认按字符串排序也就是“1.txt、10.txt、2.txt”这样的顺序处理带数字编号的章节文件时特别注意。我在后文专门写了解决方案这里先提醒一句字符串排序和自然排序在数字场景下结果完全不同。2.3 macOS和Linux下的cat合并在macOS或Linux上合并txt的默认工具是catconcatenate的缩写用法非常简单cat 文件1.txt 文件2.txt 合并结果.txt用重定向到新文件或者用追加到已有文件末尾。同样支持通配符cat *.txt 合并结果.txt同样的坑也来了通配符的顺序问题。系统按文件名在目录中的存储顺序来扩展通配符而这个顺序通常就是字典序所以“第10章.txt”会排在“第2章.txt”前面。解决办法是用sort命令对文件名排序后再合并ls *.txt | sort -V | xargs cat 合并结果.txtsort -V是“version sort”能识别文件名中的数字编号并按数字大小排列。这个参数在GNU coreutils里默认支持macOS自带的BSD sort不支持-V需要先brew install coreutils然后用gsort -V或者用ls -1v来排序ls -1v *.txt | xargs cat 合并结果.txt我个人的经验是在Linux服务器上合并日志时这个组合非常好用。日志文件通常带日期时间戳ls默认的字典序已经能保证时间顺序几乎不用额外处理。但在本地整理小说章节时数字排序的坑躲不开一定先验证文件名顺序。2.4 系统自带方案的优劣对比顺手做了一张表方便你对照选择方案平台需要安装顺序控制编码控制适合场景copy命令Windows否手动指定弱少量文件一次性合并PowerShellWindows否自带脚本控制强中量文件、可按需定制cat命令Linux/macOS否通配符/排序弱日志合并、快速拼接批处理脚本Windows否脚本控制中等批量自动化Python全平台需安装解释器完全可控强复杂场景、大量文件系统自带工具的优点是零依赖、开箱即用适合一次性小规模合并。缺点是编码控制能力弱尤其是Windows下copy命令它根本不管你文件是什么编码就是把字节原样拼在一起中文字符一旦涉及GBK和UTF-8混用就乱得一塌糊涂。所以只要你的文件数量超过10个、或者确认存在编码混用就老老实实上脚本。3. 文件编码问题合并前必须搞懂的第一道坎3.1 GBK、UTF-8、BOM到底是什么不管用哪种工具合并编码问题都绕不开。很多人在这一步翻车我先用大白话把几个概念捋清楚。字符编码简单说就是“字符”和“字节”之间的映射规则。同一个“合”字在GBK里是一组双字节在UTF-8里是另一组三字节。你用GBK解读UTF-8的字节流出来的是乱码反过来也一样。GBK中文Windows旧版默认编码兼容ASCII汉字占2字节。UTF-8现在是全平台默认的主流编码汉字占3字节兼容ASCII也是互联网传输事实标准。UTF-8 with BOM在UTF-8文件开头额外写3个字节的“标记”EF BB BF作用是让Windows记事本识别这是UTF-8文件。但Linux、macOS下很多工具不认这个标记可能导致文件开头出现看不见的字符。ANSI严格说它不是一种编码而是Windows系统里的“当前默认代码页”。中文系统下ANSI通常指GBK。合并过程中编码问题的本质是合并时如果不做识别和转换字节流就原封不动拼在一起最终文件里的内容必然是混合编码状态。你用记事本打开时记事本只能按一种编码去解读整个文件结果就是前100行正常、第101行开始乱码。3.2 用Python探测和统一文件编码处理编码问题最靠谱的方式是用脚本逐个检查文件编码然后统一转成UTF-8再合并。这里推荐一个Python库chardet它可以自动检测文本文件的编码。安装方式pip install chardet它的用法非常简单读一段字节流chardet就能给出置信度最高的编码判断。配合python脚本你可以先把所有文件的编码列出来再决定怎么处理。不过我要提醒两点chardet对短文件的检测准确率会下降少于256字节的文件基本靠猜对于纯ASCII文本chardet会报ascii编码但实际按UTF-8读也没问题。所以检测逻辑里要兼容这种边界情况。其实对于大部分个人整理场景我建议不需要纠结检测算法直接用Python的open()函数尝试多种编码逐个试读能正常读出且不抛异常就认为编码匹配。与其用chardet做概率判断不如用“实测解码”的方式做确定性判断。这个思路更直接代码也好写。4. Python脚本跨平台的一劳永逸批量合并方案4.1 最实用的Python合并脚本如果你要合并的文件数量很大或者以后还会反复处理类似的合并任务与其每次敲命令不如写个Python脚本一劳永逸。这也是我最推荐的方案因为Python脚本可以同时解决顺序、编码、换行三个核心问题。这里给出一个直接可用的参考脚本为符合平台要求的通用性文件名、路径可自行替换import os import glob import re # 配置区替换成你自己的路径 SOURCE_DIR rD:\my_files\txt_parts # 存放待合并txt的目录 OUTPUT_FILE rD:\my_files\merged.txt # 输出文件路径 SORT_BY_NUMBER True # 是否按文件名中的数字排序 def natural_key(filename): 提取文件名中的数字作为排序依据支持第2章.txt这种命名 # 提取文件名中所有数字转成整数列表 numbers re.findall(r\d, filename) if numbers: return [int(n) for n in numbers] return [0] def read_text_file(filepath): 尝试用多种编码读取txt文件返回字符串内容 for encoding in [utf-8-sig, utf-8, gb18030, gbk, latin-1]: try: with open(filepath, r, encodingencoding) as f: return f.read(), encoding except (UnicodeDecodeError, UnicodeError): continue # 兜底方案latin-1可以解码任意字节但会产生乱码 with open(filepath, r, encodinglatin-1) as f: return f.read(), latin-1 def merge_txt_files(): # 找到所有txt文件 files glob.glob(os.path.join(SOURCE_DIR, *.txt)) if not files: print(未找到任何txt文件) return # 按文件名排序 if SORT_BY_NUMBER: files.sort(keynatural_key) else: files.sort() total_size 0 line_count 0 with open(OUTPUT_FILE, w, encodingutf-8) as out: for idx, filepath in enumerate(files): content, used_encoding read_text_file(filepath) # 如果不是最后一次拼接末尾补一个换行避免内容粘连 if idx len(files) - 1 and not content.endswith(\n): content \n out.write(content) total_size os.path.getsize(filepath) line_count content.count(\n) print(f[OK] {os.path.basename(filepath)} 编码: {used_encoding}) print(f合并完成共处理 {len(files)} 个文件) print(f输出文件: {OUTPUT_FILE}) print(f估算总行数: {line_count}) if __name__ __main__: merge_txt_files()这个脚本的核心逻辑是glob找出目录下所有txt文件。排序时可以用natural_key函数提取文件名中的数字解决“第2章排在“第10章”前面的问题。读取文件时逐个尝试UTF-8、GBK、GB18030等编码哪个能正常解码就用哪个并打印出实际采用的编码方便事后核查。写出文件时统一编码为UTF-8消除源文件编码不统一的问题。拼接处用endswith检查是否需要补充换行符防止首尾粘连。实际使用中我把脚本里的路径一改就能复用。某次整理约120个章节文件时脚本一次跑通最终合并文本约2.4MB在不到1秒内完成效果远好于命令行拼接。对于曾经遇到过由于GBK文件混入而乱码的情况用这个脚本后不再出现。4.2 为什么按“第几章”排序会出现顺序错乱这个问题值得单独拉出来讲因为它太常见了。文件名如果是“第1章.txt”到“第48章.txt”默认字符串排序的结果是第1章.txt 第10章.txt 第11章.txt ... 第19章.txt 第2章.txt 第20章.txt ...原因是字符串比较是逐字符比较的字符串第10章和第2章比较时开头都是第随后比较1和21小于2所以第10章排在第2章前面。这在计算机看来是正确的排序但从人的自然认知角度来看是错的。解决思路就是提取数字再排序。上面脚本里的natural_key函数提取文件名中的所有连续数字转成整数列表然后作为排序键。这样第10章提取出[10]第2章提取出[2]排序时10大于2顺序就正确了。文件名里有多个数字时也能处理比如“卷一_第3章_修订版.txt”会提取出[1, 3]整体排序依然正确。这个排序问题在合并日志时同样存在。日志文件名如果叫“log_2024-01-01.txt”到“log_2024-12-31.txt”因为日期格式固定字符串排序天然等于时间排序不存在问题。但如果日志文件名是“log_1.txt”到“log_365.txt”就必须走数字排序逻辑。我的经验是文件名格式越规范排序问题越少。如果文件名本身就是“20240101.txt”这种定长格式完全不用操心顺序。4.3 编码、路径、换行符等细节问题写脚本时容易忽略三件事路径里有中文、文件读取时的换行符差异、输出文件的BOM处理。路径里有中文这在Windows下很常见。Python的open函数对中文路径的支持在Python 3.6以后已经没问题但要确保脚本文件本身保存为UTF-8编码。用记事本编辑脚本时注意另存为时选择UTF-8否则脚本里的中文字符串字面量会在运行时变成乱码直接报错。换行符差异。Windows默认换行符是\r\n回车换行Linux和macOS默认是\n。如果你在Windows上合并了从Linux服务器拷过来的txt输出文件的换行符可能是混搭的。多数文本编辑器能容忍这种情况但如果你后续要用程序解析这份文档建议统一。Python写文件时open()默认使用系统换行符你也可以newline参数来控制或者统一写成\n格式。BOM处理。如果你输出的是UTF-8 with BOM用记事本打开没问题但用某些Linux工具处理时开头会有看不见的字符。如果你想输出带BOM的UTF-8在open时指定encodingutf-8-sig不带BOM就用utf-8。我的个人习惯是输出不带BOM的UTF-8兼容面更广。5. 常见问题与排查实录我把实操中最容易遇到的一批问题整理成速查表基本都是自己踩过或者帮别人排查过的。现象原因解决方案合并后中文全部乱码源文件GBK编码混入用4.1节脚本按编码逐个尝试读取合并后开头有“锟斤拷”UTF-8带BOM或转换时误用GBK解码统一用utf-8-sig读取后再写入章节顺序完全错乱字符串排序导致10排在2前面提取文件名中的数字做自然排序两个文件首尾粘连前一个文件最后没换行符检查endswith(\n)并补充换行合并结果文件越来越大copy通配符把输出文件自身也读进去了输出文件放到其他目录或用明确文件名copy命令合并到一半停止文件里含CtrlZ控制字符加 /b 参数以二进制模式复制PowerShell脚本输出乱码Out-File默认编码不是UTF-8显式指定-Encoding UTF8Python读取时报UnicodeDecodeError文件编码不在尝试列表里增加latin-1兜底或调整编码优先级这几个问题里我再单独说说两个高频场景。第一编码错误导致的“锟斤拷”。“锟斤拷”这三个字在中文互联网上几乎是编码事故的代名词。它出现的原因是一段GBK编码的字节被当作GBK解析明明能解析出来但在某种转换流程中先被错误地用UTF-8解码成乱码字符再转回GBK时就变成了“锟斤拷”。要彻底避免这个原则是读取时用对编码写入时统一编码中间不要做无意义的“先解码再编码”操作。第二工具执行顺序的可视化确认。很多脚本跑完输出文件也生成了但你不确定顺序对不对。我的习惯是在脚本里加一个print把实际处理顺序打出来。上面Python脚本里已经打印了每个文件的处理顺序和识别到的编码这就是最直接的“审计日志”。跑一次就能确认顺序和编码识别是否符合预期而不是等到打开输出文件才发现问题。6. 合并之外的扩展思路合并txt文件这个事情看着简单但搞明白之后可以延伸出不少有用的技巧。比如如果你合并的是一批带章节标题的txt合并后还可以顺便生成目录。用脚本扫描每一行凡是匹配“第X章”或“第X节”的行就记录它所在的页码或行号生成一个简单的目录文件。这样就相当于把一个散装的txt合集变成了一本“可导航”的书。如果文件里有大量空白行合并后想统一清理可以在脚本里加正则替换把连续的空行压缩为一个。这个对整理网页保存的txt特别有用。如果想把合并和压缩一口做完可以在脚本末尾调用zipfile或tarfile模块把合并结果打个包省去手动压缩的步骤。如果源文件很大比如单个txt就上百MB还要合并那就不能用一次性read()了内存会扛不住。这时要改成逐行读、逐行写或者用固定大小分块读写。我处理过最大的合并任务是十几个单文件几十MB的日志用的就是按行流式合并跑完内存占用几乎没有波动。这些扩展本质上都是在“合并”这个动作之上增加了对文本结构的理解和自动化处理。掌握了前面那些基础技能这些都不难实现。我在实际使用中还有个体会很多人遇到合并txt的需求第一反应是去下载一个“合并工具”软件。但绝大多数这类小软件要么弹广告要么功能臃肿要么对中文编码支持不好。而系统自带命令加一个脚本已经能覆盖几乎所有场景还不用装第三方软件更不用担心隐私问题。尤其是公司电脑上不方便安装软件的场合这一套方案几乎是唯一稳妥的选择。最后再分享一个小技巧批处理或PowerShell脚本改完后第一次运行尽量用小样本测试只复制两三个文件到临时目录测试合并确认编码、顺序、换行都没问题再对全量文件执行。用我写的Python脚本直接改SOURCE_DIR和OUTPUT_FILE指向一个临时目录就能完成测试。这个习惯帮我至少省下过三次“合并完才发现全乱了”的重来时间。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑