2019-02-12 python3 实现文件转码为utf-8

2019-02-12  本文已影响0人  gun21d

#!/usr/bin/python

import sys

import os

import signal

import shutil

sys.path = ["../"] + sys.path

import chardet

import traceback

###################################################

#main函数

def ReadLines(fileName):

    fd =  open(fileName, "rb")#要有"rb",如果没有这个的话,默认使用gbk读文件。         

    buf = fd.read()

    fd.close() 

    result = chardet.detect(buf) 

    str=result["encoding"]

    fd = open(fileName,"r",encoding=result["encoding"]) 

    lines = fd.readlines()

    fd.close()

    return lines

def ConvertFile(strFileName, strEncoding, bBak):

    fd =  open(strFileName, "rb")#要有"rb",如果没有这个的话,默认使用gbk读文件。         

    buf = fd.read()

    fd.close() 

    result = chardet.detect(buf) 

    str=result["encoding"]

    print ("文件编码:", str)

    tarEncoding = "utf-8"

    if str != tarEncoding:

        # 读文件

        fd = open(strFileName,"r",encoding=result["encoding"]) 

        lines = fd.readlines()

        fd.close()

        #备份文件

        if bBak != 0:

            strBakupFile = strFileName + ".bak"

            shutil.move(strFileName,strBakupFile)

        # 写文件

        fw = open(strFileName, "w", encoding=tarEncoding)

        for line in lines:

            print (line, end="", file=fw)

        fw.close()

        print ("文件转换结束:", strFileName)

    else:

        print ("文件不需要转换:", strFileName)

def main():

    try:

        bBak = 1

        if len(sys.argv) > 2 and sys.argv[2] == "nobak":

            bBak = 0

        if len(sys.argv) > 1:

            p1 = sys.argv[1]

            # 目录

            if os.path.isdir(p1):

                for item in os.listdir(p1):

                    file = os.path.join(p1,  item)

                    if os.path.isdir(file): # 目录

                        pass

                    else:

                        ConvertFile(file, "utf-8", bBak)

            # 文件

            else:

                ConvertFile(sys.argv[1], "utf-8", bBak)

        else:

            print ("toUTF8 fileName/pathName <bak>")

    except:

        traceback.print_exc()

    sys.exit(0)

#####################################################

def signal_handler(signal, frame):

    print('You pressed Ctrl+C!')

    sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)

#进入main函数

main()

上一篇下一篇

猜你喜欢

热点阅读