下面是代码实现,使用到了 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) 接收一个路径参数,返回一个包含统计信息的元组。第二个函数根据用户传入的参数调用第一个函数并打印统计信息。
如果用户没有传入任何参数,则打印提示信息。如果传入了一个路径参数,则按照路径指定的文件或文件夹统计信息,并打印结果。