文件编码批量转换

这是一个Python脚本,用于批量检测并转换指定目录下.cpp和.h文件的编码格式为gb2312。它首先使用chardet库检测文件的原始编码,然后使用codecs模块进行读写操作进行转换。此外,脚本还提供了进度条显示转换进度,并支持通过命令行参数自定义编码和转换目录。
摘要由CSDN通过智能技术生成
# -*- coding:utf-8 -*-
# @Time : 2022/3/22 20:04
# @Author: zhcode
# @File : convert_file_encode.py
import chardet
import codecs
import os
import sys
import time

CURRENT_PATH = os.path.abspath('.')


def code2code(filename, encode_out):
    fileencoding = chardet.detect(open(filename, "rb").read())
    fileencode = fileencoding['encoding']
    if fileencode == encode_out:
        return
    with codecs.open(filename, mode='r', encoding=fileencode) as fi:
        data = fi.read()
    with codecs.open(filename, mode='w', encoding=encode_out) as fo:
        fo.write(data)
    return os.path.basename(filename), fileencode


def main():
    try:
        if len(sys.argv) <= 1:
            convert()
        elif sys.argv[1] == '-h':
            helper()
        else:
            argv = sys.argv[1:]
            args = [(op, argv[i + 1]) for i, op in enumerate(argv) if i % 2 == 0]
            keys = list(map(lambda x: x[0], args))
            values = list(map(lambda x: x[1], args))

            encode_out = "gb2312"
            dir_path = None
            if '-h' in keys:
                helper()
            if '-f' in keys:
                t = values[keys.index('-f')]
            if '-d' in keys:
                dir_path = values[keys.index('-d')]
            convert(f=encode_out, d=dir_path)

            print('Finish 转换完毕')

    except KeyboardInterrupt:
        print("\ngoodbye.")
    except Exception as ex:
        print(ex)
        exit(1)


def time_format(time_diff):
    add_zero = lambda t: "0{}".format(t) if t < 10 else t
    return "{}:{}:{}".format(add_zero(int(time_diff / 3600)), add_zero(int((time_diff % 3600) / 60)),
                             add_zero(int(time_diff % 60)))


def traverse_dir(file_dir):
    """
    Traverse the specific folder and return picture's name list.
    :param file_dir: Traverse folder name
    :return: picture's name list
    """
    file_path_list = []
    try:
        for root, dirs, files in os.walk(file_dir):
            # print(root, dirs, files)
            for file in files:
                if os.path.splitext(file)[1] == ".cpp" or os.path.splitext(file)[1] == ".h":
                    file_path_list.append(os.path.join(root, file))
    except Exception as ex:
        print("文件路径不正确!")

    return file_path_list


def convert(f=None, d=None):
    encode_out = f
    dir_path = None
    if not d:
        dir_path = CURRENT_PATH
    else:
        if os.path.isdir(d):
            dir_path = d
        else:
            raise Exception("该路径不是一个文件夹.")

    start_time = time.time()
    file_path_list = traverse_dir(dir_path)
    len_pics = len(file_path_list)
    # iterate filename
    # print(f_dir, " ", d_dir)
    for i in range(len_pics):
        time_diff = int(time.time() - start_time)
        time_eat = time_format(time_diff)

        file_name, file_encode = code2code(file_path_list[i], encode_out)

        progressbar(i + 1, len_pics, 50, f"{time_eat} {file_name} {file_encode}")


def progressbar(curr, total, duration=10, extra=''):
    """
    show the progress bar
    :param curr:
    :param total:
    :param duration:
    :param extra:
    :return:
    """
    frac = curr / total
    filled = round(frac * duration)
    print('\r', '▇' * filled + ' ' * (duration - filled), '[{:.0%}]'.format(frac), extra, end='')
    sys.stdout.flush()


def helper():
    app_name = sys.argv[0]
    app_name = "./{}".format(os.path.split(app_name)[-1])
    print("====== Image format conversion ======")
    print(f'{app_name}                  # 将当前文件夹下文件格式转换为gb2312格式.')
    print(f'{app_name} -f <type>        # 设置转换的编码格式')
    print(f'{app_name} -d <dirname>     # 设置转换文件的路径')
    print(f'{app_name} -h               # 帮助')


if __name__ == '__main__':
    # main()
    file_name_list = traverse_dir(CURRENT_PATH)

    for name in file_name_list:
        print(code2code(name, "gb2312"))

编码批量转换工具 已经用过,绝对好用 【基本介绍】 "批量字符编码转换工具"是绿色软件,单文件免安装,请放心试用。 批量字符编码转换工具可以在gbk,gb23123,unicode,utf8,ansi之间进行汉字编码转换。 【软件特点】 1 支持格式众多的字符串编码转换器 支持几十种字符编码转换。比如utf8转gbk,gb2312转utf8,ansi转utf8,utf8 unicode 转换,utf8转换gb2312,utf16、utf32、utf8编码转换,gbk转换utf8,utf8 ascii转换。 2 强大正则表达式支持字符编码转换软件 是唯一同时支持用正则表达式匹配和排除要转换文件夹的批量编码转换工具。 批量字符编码转换工具是文件编码转换的最佳工具。是您必备的unicode编码转换器,它帮助您快速完成编码批量转换。 utf8 转gb2312编码转换举例,编码转换软件工作原理 比如要把D:\web目录下的php文件和html文件由utf8转gb2312编码, 转换时排除test开头的文件 1 选择文本编码转换的源目录 比如选择D:\web 2 选择文件编码转换的目标目录 比如选择D:\webnew (为防操作失误,目标目录不能和源目录相同) 3 源文件编码选择65001 utf-8 4 目标文件编码选择936 gb2312 5 点选"要转换文件",输入正则表达式: \\.php|\\.html 6 点选"要排除的文件",输入正则表达式: \\test 点击"开始转换"字符编码转换工具就开始转换了,转换成功与否都会在"批量字符编码转换工具"的界面给出提示。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值