统计目录下程序源程序的行数之和-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即可

原文地址:https://www.cnblogs.com/zhaoke271828/p/15381416.html