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即可

  • 相关阅读:
    Understanding about Baire Category Theorem
    Isometric embedding of metric space
    Convergence theorems for measurable functions
    Mindmap for "Principles of boundary element methods"
    Various formulations of Maxwell equations
    Existence and uniqueness theorems for variational problems
    Kernels and image sets for an operator and its dual
    [loj6498]农民
    [luogu3781]切树游戏
    [atAGC051B]Three Coins
  • 原文地址:https://www.cnblogs.com/zhaoke271828/p/15381416.html
Copyright © 2011-2022 走看看