pythonによる一括変換ファイル符号化フォーマットの実装

2699 ワード

最近redisのソースコードを勉强して、ネット上から1部の神の注釈の良いコードをダウンロードして、しかしファイルのコードのフォーマットはutf-8の使用sourcesightが开いて文字化けして、sourceinsightはutf-8のフォーマットを支持しないで、ネット上で探して、プラグインをインストールして解决する必要があると言って、今日の主な目的はsourceinsightを整えるのではありませんて、主に最近pythonを学んで、手を练习したいです
python初心者なので、主に使うモジュールや関数を記録して印象を深めます
使用モジュール:os,sys,codec,chardet
関数の使用
sys.argv:コマンドラインパラメータを取得するために使用するsys.Argv[0]コード自体のパスを識別する
os.path:操作経路の共通関数を実現
os.path.isfile:ファイルかどうかを判断する
os.path.isdir:ディレクトリかどうかを判断する
os.walk:ディレクトリツリーを巡り、3元グループ(root,dirs,files)を返します.
rootとは、現在遍歴しているこのフォルダの自身のアドレスを指します.
dirsはリストで、そのフォルダ内のすべてのディレクトリの名前(サブディレクトリを含まない)です.
filesは同じlistで、コンテンツはフォルダ内のすべてのファイル(サブディレクトリを含まない)です.
この関数は少し理解しにくい感じがして、1つの大神の文章を発見して、書いたのは特に詳しくて、リンクを貼ります:
        http://www.cnblogs.com/herbert/archive/2013/01/07/2848892.html
os.path.join:複数のパスをマージして戻ります
codecs.Open:ファイルを開くときにファイルをUnicode符号化に変換し、文字化けし、ファイルハンドルに戻る
ファイルハンドルread:ファイル内容を読み出し、ファイル内容を戻り値から返す
ファイルハンドルwrite:ファイルを書く
chardet.detect:ファイルの符号化フォーマットを識別し、辞書を返します.
confidence:返される符号化フォーマットの可能性
encoding:エンコーディングフォーマット
OK、コードを貼る
# -*- coding: utf-8 -*-

'''
This file is order to covert file code format batch process
'''
import os
import sys
import codecs
import chardet

def GetFileExtension(file):
    (filepath, filename) = os.path.split(file)
    (shortname, extension) = os.path.splitext(filename)
    return extension

def GetFileEncodingFormat(file):
    fileHandle  = open(file, 'r', errors = 'ignore')
    fileContext = fileHandle.read()
    return chardet.detect(fileContext.encode())["encoding"]

def CovertFileCodeFormat(file, out_encode):
    try:
        encoding = GetFileEncodingFormat(file)
        extension = GetFileExtension(file)
        if (encoding != out_encode and (extension == '.c' or extension == '.h')):
            fileHandle  = codecs.open(file, 'r', encoding, errors = 'ignore')
            fileContext =  fileHandle.read()
            codecs.open(file, 'w', out_encode,  errors = 'ignore').write(fileContext)
            print ("convert:" + file + " sucess")
    except IOError as err:
        print ("I/O error: {0}".format(err))

def ProcessDir(dir):
    for root, dirs, files in os.walk(dir):
        for file in files:
            filePath = os.path.join(root, file)
            CovertFileCodeFormat(filePath, sys.argv[2])
    
def main():
    path = sys.argv[1]
    if (os.path.isfile(path)):
        CovertFileCodeFormat(path, sys.argv[2])
    elif (os.path.isdir(path)):
        ProcessDir(path)
    
if __name__ == '__main__':
    main()