批量TXT编码转换的坑

引言

我在批量转txt文件的时候出现了两种编码的文件混在一起转,导致了本来就是utf-8编码的文件又重新转码了一次,结果就是出现了乱码。

一、基本思路

  1. 获取需要改变编码格式的文件夹路径

  1. 读取该文件夹下的txt文件,利用第三方库chardet进行编码格式查看,并将该编码格式记录

  1. 如果该txt文件被记录的编码与你要跳过的编码不一致,则用utf-8重新编码,重新写入源文件并覆盖,实现转码

二、遇到的问题

1. 由于批量转码的时候可能会遇到,一个文件夹下面的文件不全是一种的编码,所以需要通过chardet进行读取txt文件的编码类型并记录,如果出现问题则可能是文件编码问题。

2. 预测结果为GB2312的文本直接处理,反之跳过。

        with open(filePath, "rb") as f:
            data = f.read()
            a = chardet.detect(data)['encoding']
            b = 'GB2312'
            if a == b:
                convert(filePath, 'GB2312', 'UTF-8')

三、源码

import os
import codecs
import chardet


def list_folders_files(path):

    list_folders = []
    list_files = []
    for file in os.listdir(path):
        file_path = os.path.join(path, file)
        if os.path.isdir(file_path):
            list_folders.append(file)
        else:
            list_files.append(file)
    return (list_folders, list_files)


def convert(file, in_enc="GBK", out_enc="UTF-8"):
    """
该程序⽤于将⽬录下的⽂件从指定格式转换到指定格式,默认的是GBK转到utf-8
   """
    in_enc = in_enc.upper()
    out_enc = out_enc.upper()
    try:
        print("convert [ " + file.split('\\')[-1] + " ].....From " + in_enc + " --> " + out_enc)
        f = codecs.open(file, 'r', in_enc, "ignore")
        new_content = f.read()
        codecs.open(file, 'w', out_enc).write(new_content)
    except IOError as err:
        print("I/O error: {0}".format(err))



if __name__ == "__main__":
    print('abc')
    path = r'F:\python\txt'
    (list_folders, list_files) = list_folders_files(path)
    print("Path: " + path)
    for fileName in list_files:
        filePath = path + '\\' + fileName
        with open(filePath, "rb") as f:
            data = f.read()
            a = chardet.detect(data)['encoding']
            b = 'GB2312'
            if a == b:
                convert(filePath, 'GB2312', 'UTF-8')


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思风而过

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值