Python实现批量查看文件编码
想要批量查看指定目录下的文件编码格式,发现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模块,按装方法请自行百度