zoukankan      html  css  js  c++  java
  • 统计目录下程序源程序的行数之和-Python

    一个比较实用的功能,统计一个工程下面,某种代码的总行数。

    以Unity开发的C#为例,整个目录下面只有三种文件:文件夹、cs文件、meta文件。

     

    我们的目标是检索该目录下以及所有的子文件夹内的cs文件,并统计cs文件的内容的行数之和。

    **以下代码都需要 import os

    1. 首先找到所有的cs文件,只需要递归查找即可

    def find_all_cs_files(path):
        if os.path.isdir(path):
            for sub_dir in os.listdir(path):
                find_all_cs_files(os.path.join(path, sub_dir))
        elif path[-2:] == "cs":
            print(path)
    if __name__ == '__main__':
        find_all_cs_files("D:/ExecuSimu/ExecuDS10/Assets/Scripts")

    打印结果如下:

    D:/ExecuSimu/ExecuDS10/Assets/ScriptsAdjListCreate.cs
    D:/ExecuSimu/ExecuDS10/Assets/ScriptsAdjMatrixCreate.cs
    D:/ExecuSimu/ExecuDS10/Assets/ScriptsAvgData.cs
    D:/ExecuSimu/ExecuDS10/Assets/ScriptsBackGround.cs
    D:/ExecuSimu/ExecuDS10/Assets/Scriptsutton.cs
    D:/ExecuSimu/ExecuDS10/Assets/ScriptsChangeImage.cs
    D:/ExecuSimu/ExecuDS10/Assets/ScriptsChangeImage2.cs
    D:/ExecuSimu/ExecuDS10/Assets/ScriptsCity.cs

    ......

    2. 然后实现统计一个cs文件代码行数的功能,其实就是读取该文件,并逐行读取,每读取一行,就将结果加1,读取完毕之后,最后返回结果

    def count_file_line(path):
        print("当前文件:", path)
        count = 1
        with open(path, 'r', encoding="utf_8_sig") as f:
            line = f.readline()
            while line:
                line = f.readline()
                count += 1
        return count
    if __name__ == '__main__':
        line_count = count_file_line("D:/ExecuSimu/ExecuDS10/Assets/ScriptsProofClueManager.cs")
        print(line_count)

    通过记事本打开该文件,确认目标代码文件是92行,而该段程序打印结果也是92行,代码正确。

    3. 然后修改递归查找的代码,定义一个全局变量,然后递归结构中,每找到一个cs文件,便统计该文件内容的行数,加到全局变量中,最后返回结果。

    import os
    
    
    def count_file_line(path):
        print("当前文件:", path)
        count = 1
        with open(path, 'r', encoding="utf_8_sig") as f:
            line = f.readline()
            while line:
                line = f.readline()
                count += 1
        return count
    
    
    def find_all_cs_files(path):
        if os.path.isdir(path):
            for sub_dir in os.listdir(path):
                find_all_cs_files(os.path.join(path, sub_dir))
        elif path[-2:] == "cs":
            print(path)
    
    
    sum_line_count = 0
    
    
    def count_dir_files_code_lines(path):
        global sum_line_count
        if os.path.isdir(path):
            for sub_dir in os.listdir(path):
                count_dir_files_code_lines(os.path.join(path, sub_dir))
        # elif path[-len(category):] == category:
        elif path[-2:] == "cs":
            sum_line_count += count_file_line(path)
            print("当前计数:", sum_line_count)
        return sum_line_count
    
    
    if __name__ == '__main__':
        line_count = count_dir_files_code_lines("D:/ExecuSimu/ExecuDS10/Assets/Scripts")
        print(line_count)

    将代码稍作修改,可以统计其他类型的文件代码行数,以统计文件夹下所有的java代码行数为例,在以上代码的基础上,做以下改动即可:

    def count_dir_files_code_lines(path, category):
        global sum_line_count
        if os.path.isdir(path):
            for sub_dir in os.listdir(path):
                count_dir_files_code_lines(os.path.join(path, sub_dir), category)
        elif path[-len(category):] == category:
            # elif path[-2:] == "cs":
            sum_line_count += count_file_line(path)
            print("当前计数:", sum_line_count)
        return sum_line_count
    
    
    if __name__ == '__main__':
        line_count = count_dir_files_code_lines("D:/javaworkspace/asoul-applications/src", 'java')
        print(line_count)

    如果需要统计所有文件的行数,那么在函数 count_dir_files_code_lines(path, category) 中的 elif 改为 else即可

  • 相关阅读:
    P4168 [Violet]蒲公英
    P3320 [SDOI2015]寻宝游戏
    P2487 [SDOI2011]拦截导弹
    P3338 [ZJOI2014]力(FFT)
    P1975 [国家集训队]排队
    P4103 [HEOI2014]大工程
    虚树小结
    LVS初步
    常见指针定义解读
    可epoll队列
  • 原文地址:https://www.cnblogs.com/zhaoke271828/p/15381416.html
Copyright © 2011-2022 走看看