Python 标准库 collections, sys, os: 统计目前写过的 python 代码

下面是代码实现,使用到了 os 和 collections 两个标准库。

import os
from collections import defaultdict
import sys

def count_code_info(path):
    # 存放结果的字典
    result = defaultdict(int)
    # 文件后缀名为 .py 的文件个数
    result['file_num'] = 0
    # 文件中代码行数
    result['code_lines'] = 0
    # 文件中空行数
    result['space_lines'] = 0
    # 文件中注释行数
    result['comment_lines'] = 0
    # 判断路径是否为文件
    if os.path.isfile(path):
        if path.endswith('.py'):
            with open(path, 'r', encoding='utf-8') as f:
                for line in f:
                    line = line.strip()
                    if line.startswith('#'):
                        result['comment_lines'] += 1
                    elif not line:
                        result['space_lines'] += 1
                    else:
                        result['code_lines'] += 1
            result['file_num'] += 1
    # 如果路径是一个目录
    elif os.path.isdir(path):
        for dirpath, dirnames, filenames in os.walk(path):
            for filename in filenames:
                if filename.endswith('.py'):
                    file_path = os.path.join(dirpath, filename)
                    with open(file_path, 'r', encoding='utf-8') as f:
                        for line in f:
                            line = line.strip()
                            if line.startswith('#'):
                                result['comment_lines'] += 1
                            elif not line:
                                result['space_lines'] += 1
                            else:
                                result['code_lines'] += 1
                    result['file_num'] += 1
    return tuple(result.values())

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print('请输入需要统计的文件或文件夹路径!')
    else:
        path = sys.argv[1]
        result = count_code_info(path)
        print(f'文件个数: {result[0]}')
        print(f'代码行数: {result[1]}')
        print(f'空行数: {result[2]}')
        print(f'注释行数: {result[3]}')


这个代码实现了两个函数,第一个函数 count_code_info(path) 接收一个路径参数,返回一个包含统计信息的元组。第二个函数根据用户传入的参数调用第一个函数并打印统计信息。

如果用户没有传入任何参数,则打印提示信息。如果传入了一个路径参数,则按照路径指定的文件或文件夹统计信息,并打印结果。