Python实现批量查看文件编码

作者: hsf 分类: Python 发布时间: 2019-11-20

想要批量查看指定目录下的文件编码格式,发现Python使用chardet比较方便,而且编码相对全面,功能也比较强大,就用Python编写了一下

自动遍历目录及子目录下所有文件并查看编码方式
结果可输出至文件或者控制台窗口
支持命令行形式传参
"""
实现功能:
查看指定目录下所有文件的文件编码
调用方式:
ViewFileDecode.py -i <文件目录> -o <输出文件路径> -s <是否包含子目录,1表示包含,其他值不包含子目录>
备注:
默认包含子目录
"""
import sys,getopt,os,chardet

def view_file_decode(filename):
    data =open(filename, "rb").read()
    return chardet.detect(data)

def get_file_path(root_path,file_list,dir_list,in_subdir = 1):
    #获取该目录下所有的文件名称和目录名称
    dir_or_files = os.listdir(root_path)
    for dir_file in dir_or_files:
        #获取目录或者文件的路径
        dir_file_path = os.path.join(root_path,dir_file)
        #判断该路径为文件还是路径
        if os.path.isdir(dir_file_path):
            dir_list.append(dir_file_path)
            #递归获取所有文件和目录的路径
            if in_subdir == 1 or in_subdir == '1':
                get_file_path(dir_file_path,file_list,dir_list,in_subdir)
        else:
            file_list.append(dir_file_path)

def main(argv):
    inputfolder = ""
    outputfile = ""
    subdir = 1

    try:
        opts,args = getopt.getopt(argv,"hi:o:s:",["ifile=","ofile=","subdir="])
    except getopt.GetoptError:
        print("ViewFileDecode.py -i <inputfolder> -o <outputfile> -s <subdir flag>")
        sys.exit(2)
    for opt,arg in opts:
        if opt == "-h":
            print("ViewFileDecode.py -i <inputfolder> -o <outputfile> -s <subdir flag>")
        elif opt in ("-i","--ifile"):
            inputfolder = arg
        elif opt in ("-o","--ofile"):
            outputfile = arg
        elif opt in ("-s","--subdir"):
            subdir = arg

    # 用来存放所有的文件路径
    file_list = []
    # 用来存放所有的目录路径
    dir_list = []
    get_file_path(inputfolder, file_list, dir_list,subdir)
    #print(inputfolder,"--",outputfile,"--",subdir)

	#如果输出文件不为空,则输出到输出文件,否则输出到控制台窗口
    if not outputfile:
        for file in file_list:
            print(file, "-->", view_file_decode(file))
    else:
        fo = open(outputfile,"a+")
        for f in file_list:
            fo.write('{0}-->{1}\r\n'.format(f,view_file_decode(f)))
        fo.close()


"""
手动查看方式,manual_view,传递一个路径即可,自动返回遍历到的所有文件的编码信息
folderpath:遍历的路径,如:r"J:\AntiNetTimeout\AntiNetTimeout"
outfile:输出文件,结果将导出到该文件中,如:r"J:\outfile.txt"
in_subdir:是否包含子目录,如果值为1,则会遍历子目录下的所有文件,如果不为1,则只遍历当前目录下的文件

示例代码:
#输出结果到控制台
manual_view(r"J:\Test",r"",1)
#输出结果到指定文件
manual_view(r"J:\Test",r"J:\log.txt",1)
"""
def manual_view(folderpath,outfile,in_subdir = 1):
    #根目录路径
    root_path = folderpath
    #用来存放所有的文件路径
    file_list = []
    #用来存放所有的目录路径
    dir_list = []
    get_file_path(root_path,file_list,dir_list,in_subdir)

    if not outputfile:
        for file in file_list:
            print(file, "-->", view_file_decode(file))
    else:
        fo = open(outputfile,"a+")
        for f in file_list:
            fo.write('{0}-->{1}\r\n'.format(f,view_file_decode(f)))
        fo.close()

运行后结果如下所示:

resource.h-->{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}
soso.aps-->{'encoding': 'TIS-620', 'confidence': 0.24910699294811314, 'language': 'Thai'}
soso.cpp-->{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}
soso.rc-->{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}
soso.vcproj-->{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}
soso.vcproj.QW-PC.QW.user-->{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
soso.vcproj.wodeafei-PC.wodeafei.user-->{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
stdafx.h-->{'encoding': 'ISO-8859-1', 'confidence': 0.6940983606557376, 'language': ''}
TestBtn.h-->{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}
sys_wnd_bkgnd.png-->{'encoding': 'Windows-1254', 'confidence': 0.2699406059988939, 'language': 'Turkish'}
sys_xml_msgbox.xml-->{'encoding': 'UTF-8-SIG', 'confidence': 1.0, 'language': ''}
sys_xml_skin.xml-->{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
souieditor.rar-->{'encoding': None, 'confidence': 0.0, 'language': None}
Swedish.lng-->{'encoding': 'UTF-16', 'confidence': 1.0, 'language': ''}

需要安装chardet模块,按装方法请自行百度


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注