批量转码文本文件的脚本

wen 实用脚本 2

批量转码文本文件脚本实战指南:从乱码困境到自动化处理


目录导读

  1. 为什么你需要批量转码?——乱码场景与痛点分析
  2. 转码脚本的核心原理——编码格式与Python/Shell实现逻辑
  3. 五步打造你的专属批量转码工具——代码逐段拆解
  4. 常见问题与进阶技巧——处理大文件、保留时间戳、跨平台适配
  5. 问答环节——解决你最纠结的编码问题

为什么你需要批量转码?

批量转码文本文件的脚本

日常工作中,我们常会遇到:从老旧的Windows XP系统拷贝的TXT文件,在macOS或Linux上打开变成乱码;从网上下载的剧本、小说源码,在编辑器中显示为“锟斤拷”或“������”,这背后是编码不一致导致的——GBK、UTF-8、ANSI、Unicode之间的切换错误。

手动用记事本另存为转换,一次只能处理一个文件,当你有数百个日志文件需要从GBK转为UTF-8,或者需要将大量CSV统一转换为无BOM头格式时,人工操作不仅耗时,还极易出错。批量转码脚本正是为此而生:通过几行代码,实现秒级批量处理,且完全保留原文件目录结构。

转码脚本的核心原理

一切转码的基础是Python的codecs模块或open()函数的encoding参数,其逻辑本质是:读取原始字节流 → 按源编码解码为Unicode → 按目标编码重新编码写入

将GBK转为UTF-8,核心命令仅为:

with open('old.txt', 'r', encoding='gbk') as f:
    content = f.read()
with open('new.txt', 'w', encoding='utf-8') as f:
    f.write(content)

但批量处理需要加入目录遍历os.walk)、条件过滤(忽略二进制文件)、异常捕获(避免一个坏文件中断整个流程)。

五步打造你的专属批量转码工具

以下脚本支持递归处理子文件夹,自动跳过非.txt格式文件,并保留原文件名。

第一步:导入模块与定义参数

import os
import sys
def batch_convert(src_dir, dst_dir, src_enc='gbk', dst_enc='utf-8'):
    # 若目标文件夹不存在则创建
    if not os.path.exists(dst_dir):
        os.makedirs(dst_dir)

第二步:遍历所有文件并转换

    for root, dirs, files in os.walk(src_dir):
        for file in files:
            if file.endswith('.txt'):
                full_path = os.path.join(root, file)
                # 保留相对路径结构
                rel_path = os.path.relpath(full_path, src_dir)
                dst_path = os.path.join(dst_dir, rel_path)
                # 确保子目录存在
                os.makedirs(os.path.dirname(dst_path), exist_ok=True)
                try:
                    # 错误处理:忽略无法解码的文件
                    with open(full_path, 'r', encoding=src_enc, errors='ignore') as f:
                        content = f.read()
                    with open(dst_path, 'w', encoding=dst_enc) as f:
                        f.write(content)
                    print(f'成功: {rel_path}')
                except Exception as e:
                    print(f'失败: {rel_path} - {e}')

第三步:运行与测试

if __name__ == '__main__':
    # 示例:将当前目录下的“原始文件”转为“转码后”
    batch_convert('./原始文件', './转码后', 'gbk', 'utf-8')

第四步(进阶):命令行参数化
使用argparse可让非编程人员直接通过命令行操作,例如python convert.py --source D:/data --target E:/out --from gbk --to utf-8

第五步:批量处理CSV/JSON
只需将file.endswith('.txt')改为('.csv', '.json'),并注意CSV通常需要处理BOM头(utf-8-sig编码可兼容Excel)。

常见问题与进阶技巧

  • 问题1:文件太大,内存溢出怎么办?
    使用chunk分块读写,例如每次读取10MB:

    with open(src, 'r', encoding=src_enc) as f_in:
        with open(dst, 'w', encoding=dst_enc) as f_out:
            while True:
                chunk = f_in.read(1024*1024)  # 1MB
                if not chunk:
                    break
                f_out.write(chunk)
  • 问题2:如何保留原文件的修改时间?
    os.stat()获取原始st_mtime,转码后用os.utime()恢复。

  • 问题3:Windows与Linux路径分隔符不兼容?
    统一使用os.path.joinos.sep,避免硬编码或。

  • 进阶技巧:自动检测源编码
    安装chardet库,读取文件的前4096字节自动猜测编码,彻底摆脱手动指定:

    import chardet
    with open(full_path, 'rb') as f:
        raw = f.read(4096)
        result = chardet.detect(raw)
        src_enc = result['encoding']

问答环节

问:为什么转码后的文件在Excel中打开中文正常,但在记事本中却显示为“锟斤拷”?
答:这是典型的UTF-8 BOM头问题,Excel需要BOM(字节序标记)来识别UTF-8,而记事本可能将其解析为乱码,解决方案:若目标是纯文本阅读,使用utf-8无BOM;若目标兼容Excel,使用utf-8-sig,脚本中修改dst_enc='utf-8-sig'即可。

问:我有一批文件,部分已是UTF-8,部分还是GBK,能否自动跳过已转码的?
答:可以,在转换前先判断能否用目标编码正确解码,若能则跳过:

try:
    content = open(full_path, 'r', encoding=dst_enc).read()
    print(f'跳过(已是目标编码): {rel_path}')
    continue
except UnicodeDecodeError:
    pass  # 继续执行转换

问:脚本运行时报错“FileNotFoundError”怎么排查?
答:首先检查路径是否为绝对路径或正确相对路径,确认目标文件夹的父级目录存在(脚本中已自动makedirs),打印full_pathdst_path进行单步调试。

问:是否能转码所有类型的文件?
答:只能转纯文本格式,二进制文件(如.exe.jpg)强行转码会损坏数据,建议在脚本中增加白名单扩展名,例如('.txt', '.log', '.csv', '.md')


通过上述脚本与技巧,你已能彻底告别手动复制粘贴的转码噩梦,无论是维护老旧项目代码,还是整理跨平台数据,这套方案都能稳定高效地完成任务,如果遇到特殊字符(如繁体中文或日文),调整编码参数即可(如big5shift_jis),原理完全一致,立即运行你的首个脚本,让杂乱无章的乱码文件秒变规整吧!

抱歉,评论功能暂时关闭!