python:扫描目录下重复引用【头文件】的文件

使用场景:
某工程下的代码文件中存在重复引用头文件的情况,现在需要找到这些文件,并将问题文件以及重复引用的头文件输出。

import os
import re
from collections import Counter
from collections import defaultdict
import chardet
import json

desDir = "D:/XX"     #请配置需要扫描的目录

DupHeaderFiles=[]
file_list = defaultdict(list)

# 获取文件编码类型
def get_encoding(file):
    # 二进制方式读取,获取字节数据,检测类型
    with open(file, 'rb') as f:
        data = f.read()

        return(chardet.detect(data)['encoding'])
    
 
 
# 查重
def find_Dup(fileName):
    code=get_encoding(fileName)
    f=open(fileName,'r',encoding=code)
    
    hasDup = False
    lines=f.readlines()
    f.close()

    #先筛选出包含"#include"的行
    include_lines = []
    for line in lines:
        if(re.match('#include', line)):
            include_lines.append(line)
    b = dict(Counter(include_lines))

    #判断文件是否有问题
    for key, value in b.items():
        if(value > 1):
            hasDup = True

    #记录问题        
    if(hasDup == True):
        print("问题文件:"+fileName)
        
        
        print("重复头文件:")
        p1 = re.compile(r'[<](.*?)[>]', re.S)  # 最小匹配
        p2 = re.compile(r'["](.*?)["]', re.S)
        toPrint=[key for key, value in b.items() if value > 1]  # 只展示重复元素
        for key in toPrint:
            
            if(re.findall(p1, key)):
                DupHeaderFile=re.findall(p1, key)[0]

            else:
                DupHeaderFile=re.findall(p2, key)[0]
            
            print(DupHeaderFile)
            file_list[fileName].append(DupHeaderFile) 
           
            DupHeaderFiles.append(DupHeaderFile) 
        
        #print("正在写入文件:filelog.txt......")

        write_to_filelog(file_list)#将问题文件与对应的重复头文件写入文件

        HeaderFiles = set(DupHeaderFiles) #去重
 
        #print("正在写入文件:HeaderFileLog.txt......")
        write_to_headerfilelog(HeaderFiles)  #将头文件列表写入文件

        
        print()
    
    


#将问题文件和对应的重复引用 写入文件
def write_to_filelog(file_list):
    json_str = json.dumps(file_list, indent=4)
    with open('FileLog.txt', 'w') as f:
        f.write(json_str)
        

#将头文件列表写入文件
def write_to_headerfilelog(HeaderFiles):
    with open('HeaderFileLog.txt', 'w') as f:
        for headerfile in HeaderFiles:
            f.write(headerfile+'\n')
        

#扫描指定目录下文件
def scan_files(directory, prefix=None, postfix=None):  
    print("开始扫描[{0}]......\n".format(directory))
    if not os.path.isdir(directory):  ##判断是否是目录
        print("{0} 目录有误,请检查".format(directory))
        exit(-1)


    for root, sub_dirs, files in os.walk(directory):
        for special_file in files:
            if special_file.endswith(".c") or special_file.endswith(".h"):  #添加后缀以便筛选文件
                #print("扫描中......:"+os.path.join(root, special_file))                            
                find_Dup(os.path.join(root, special_file))



if __name__ == "__main__":
    scan_files(desDir)
    print("扫描完成!")
    print("写入文件完成!")
发布了143 篇原创文章 · 获赞 45 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/z714405489/article/details/97798487
今日推荐