使用Python设计一个代码统计工具

使用Python设计一个代码统计工具可以帮助开发者统计代码行数、空行数、注释行数等信息,对于项目管理和代码规范性检查具有很大的帮助作用。下面是设计这个工具的完整攻略。

设计思路

1.首先,我们需要获取代码文件路径,可以使用命令行参数来实现。使用sys.argv获取命令行参数列表,第一个参数是脚本名称,后面的参数依次代表输入的代码文件路径。

2.其次,我们需要遍历代码目录下的所有文件,可以使用os模块中的walk函数实现。

3.然后,我们需要按照代码、注释、空行的规则统计每个文件中的行数。可以定义3个变量:code_linescomment_linesblank_lines来分别表示代码行数、注释行数、空行数。使用正则表达式匹配判断每一行的类型,归入对应的行类型。

4.最后,我们需要将每个文件的统计结果累加到总行数中。

代码实现

import os
import sys
import re

def count_lines(filepath):
    '''统计对应文件的代码行数、注释行数、空行数'''
    code_lines = 0
    comment_lines = 0
    blank_lines = 0
    with open(filepath, 'r', encoding='utf-8') as fp:
        for line in fp:
            if re.match(r'^\s*$', line):  # 空行
                blank_lines += 1
            elif re.match(r'^\s*#', line):  # 注释行
                comment_lines += 1
            else:  # 代码行
                code_lines += 1
    return code_lines, comment_lines, blank_lines

if __name__ == '__main__':
    code_lines_total = 0  # 总代码行数
    comment_lines_total = 0  # 总注释行数
    blank_lines_total = 0  # 总空行数
    try:
        for path in sys.argv[1:]:
            if os.path.isfile(path):
                code_lines, comment_lines, blank_lines = count_lines(path)
                code_lines_total += code_lines
                comment_lines_total += comment_lines
                blank_lines_total += blank_lines
                print(f'在 {path} 中: 代码行数: {code_lines}, 注释行数: {comment_lines}, 空行数: {blank_lines}')
            elif os.path.isdir(path):
                for dirpath, dirnames, filenames in os.walk(path):
                    for filename in filenames:
                        if filename.endswith('.py'):
                            filepath = os.path.join(dirpath, filename)
                            code_lines, comment_lines, blank_lines = count_lines(filepath)
                            code_lines_total += code_lines
                            comment_lines_total += comment_lines
                            blank_lines_total += blank_lines
                            print(f'在 {filepath} 中: 代码行数: {code_lines}, 注释行数: {comment_lines}, 空行数: {blank_lines}')
            else:
                print(f'{path} 不是有效的文件或目录')
    except Exception as e:
        print(e)

    print(f'总代码行数: {code_lines_total}, 总注释行数: {comment_lines_total}, 总空行数: {blank_lines_total}')

示例说明

例如,我们有一个包含以下三个文件的项目。

project/
├── main.py 
├── module1.py
└── test/
    └── testcase.py

main.py 代码如下。

# main.py
import module1


def print_hello():
    print('Hello, world!')


if __name__ == '__main__':
    print_hello()
    module1.add(1, 2)

module1.py 代码如下。

# module1.py

def add(a, b):
    return a + b

testcase.py 代码如下。

# testcase.py

import unittest

class TestAdd(unittest.TestCase):

    def test_add(self):
        self.assertEqual(add(1, 2), 3)


if __name__ == '__main__':
    unittest.main()

我们在命令行中运行以下命令,即可得到统计结果。

python count_lines.py project

输出结果为

在 project/main.py 中: 代码行数: 5, 注释行数: 2, 空行数: 1
在 project/module1.py 中: 代码行数: 2, 注释行数: 1, 空行数: 0
在 project/test/testcase.py 中: 代码行数: 8, 注释行数: 2, 空行数: 1
总代码行数: 15, 总注释行数: 5, 总空行数: 2

从结果可以看出,本次统计涵盖了项目目录下所有的 .py 文件,包括子目录中的文件。而且每个文件的统计结果也都正确。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用Python设计一个代码统计工具 - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • Scrapy爬虫实例讲解_校花网

    下面我就来详细讲解“Scrapy爬虫实例讲解_校花网”这篇文章的完整攻略。 Scrapy爬虫实例讲解_校花网 简介 本文将介绍如何使用Scrapy框架爬取校花网中的图片,并将图片下载到本地。校花网是一个美女图片站,提供了大量美女图片资源,但是在该网站中下载图片并不方便,因此可以使用Scrapy框架来实现自动化爬取。 进入校花网 首先,我们需要进入校花网(ht…

    python 2023年5月14日
    00
  • Python的pygame安装教程详解

    Python的pygame安装教程详解如下: 1. 安装Python 在安装pygame之前,需要先安装Python。具体的安装方法可以参考Python官网提供的教程,这里不再赘述。 2. 安装pygame 2.1 下载pygame 在安装pygame之前,需要先下载pygame的安装包。可以在pygame官网(https://www.pygame.org/…

    python 2023年5月14日
    00
  • 全国计算机等级考试二级Python语言程序设计考试大纲与知识点考点汇总

    好的!针对全国计算机等级考试二级Python语言程序设计考试,以下是一个完整的攻略: 一、了解考试大纲 全国计算机等级考试二级Python语言程序设计考试大纲主要包括四个部分:考试内容、考试形式、考试要求、考试命题。大纲中详细规定了需要掌握的知识点。 二、完善知识点掌握 根据考试大纲中的要求和知识点,需要认真学习和掌握相关内容,可以通过以下方式来完善知识点掌…

    python 2023年5月13日
    00
  • Python pip安装lxml出错的问题解决办法

    下面是详细讲解“Python pip安装lxml出错的问题解决办法”的完整攻略。 问题描述 在使用pip安装Python的lxml模块时,可能会遇到以下报错信息: Building wheels for collected packages: lxml Building wheel for lxml (setup.py) … error ERROR: C…

    python 2023年6月3日
    00
  • 利用Python/R语言分别解决金字塔数求和问题

    利用Python/R语言分别解决金字塔数求和问题的完整攻略 问题描述 假设有一个数字金字塔,如下所示: 1 2 3 4 5 6 7 8 9 10 需要计算从顶部到底部的所有路径的和。 Python解决方法 解题思路 读取金字塔数据 从第二行开始遍历金字塔,对于每个元素,计算该元素可到达路径上所有元素的和,将其替换为该和。 示例代码 # 读取金字塔数据 wit…

    python 2023年6月5日
    00
  • Python模块搜索概念介绍及模块安装方法介绍

    Python模块搜索概念介绍及模块安装方法介绍 什么是模块搜索 在Python中,模块是一个包含Python定义和语句的文件。每个Python程序都可以使用一个或多个模块,以便访问其提供的功能。因此,在编写Python程序时,其中一个重要的步骤是选择适当的模块并将其导入到程序中。 Python模块搜索指的是,当我们使用import语句导入模块时,Python…

    python 2023年5月14日
    00
  • 使用Python实现BT种子和磁力链接的相互转换

    使用Python实现BT种子和磁力链接的相互转换 BT种子和磁力链接是现代P2P文件共享网络中最为常见的资源获取方式。本文将介绍如何使用Python实现BT种子和磁力链接的相互转换。 1. BT种子和磁力链接的定义 BT种子是一种种子文件,它包含了一个或多个文件的元数据,包括文件名、文件大小、文件数量、文件MD5值、Tracker列表等信息。通过BT种子文件…

    python 2023年6月2日
    00
  • python字符串反转的四种方法详解

    Python字符串反转的四种方法详解 在Python中,字符串是一种非常常见的数据类型,并且在字符串处理中经常需要进行字符串反转这一操作。 本文将详细讲解Python字符串反转的四种有效方法。 方法一:使用字符串切片 字符串切片可以直接得到反转后的字符串。 示例代码: string = "Hello, World!" reversed_s…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部