Python에서 코드 통계 도구를 구현하는 방법

php中世界最好的语言
풀어 주다: 2018-04-09 16:02:47
원래의
1477명이 탐색했습니다.

이번에는 Python에서 코드 통계 도구를 구현하는 방법을 보여 드리겠습니다. Python에서 코드 통계 도구를 구현할 때 주의 사항은 무엇입니까?

Question

파일 수, 코드 줄, 주석 줄 수, 빈 줄 수 등 프로젝트의 코드 줄 수를 계산하는 프로그램을 설계하세요. 다양한 매개변수를 입력하여 다양한 언어로 프로젝트 수를 계산하여 디자인을 더욱 유연하게 만들어 보세요. 예:

# type用于指定文件类型
python counter.py --type python
로그인 후 복사

Output:

files:10
code_lines:200
comments:100
blanks:20

Analysis

이것은 간단해 보이지만 해결하기가 다소 복잡한 설계 문제입니다. 파일의 코드 줄 수를 올바르게 계산할 수 있다면 디렉터리 수를 계산하는 것입니다. 문제가 되지 않습니다. 가장 복잡한 것은 여러 줄 주석에 관한 것입니다. Python을 예로 들면 주석 코드 줄에는 다음과 같은 상황이 있습니다.

1. 파운드 기호로 시작하는 한 줄 주석

# 한 줄 주석

2. 같은 줄에 여러 줄 주석

"" "이것도 여러 줄 주석입니다""
'''이것도 여러 줄 주석입니다'''
3.

"""

이 3줄은 모두 주석 문자입니다
"""

저희 아이디어 줄별 구문 분석을 사용하면 여러 줄 주석에 현재 줄이 여러 줄 주석에 있는지 식별하기 위해 추가 식별자 in_multi_comment가 필요합니다. 기본값은 False입니다. 여러 줄 주석이 시작되면 다음 여러 줄이 나타나면 True로 설정됩니다. 여러 줄 주석의 시작 기호와 다음 닫는 기호 사이의 코드는 주석이 달린 줄에 속해야 합니다.

지식

올바르게

파일을 읽는 방법, 읽은 파일을 문자열으로 처리할 때, 문자열의 일반적인 방법

간소화 버전

반복합니다. 단계별로, 먼저 Python 코드의 단일 파일만 계산하고 여러 줄 주석을 고려하지 않는 단순화된 버전의 프로그램을 구현합니다. 이는 Python을 처음 접하는 사람이라면 누구나 달성할 수 있는 기능입니다. 중요한 점은 각 줄을 읽은 후 string() 메서드를 사용하여 문자열 양쪽의 공백과 캐리지 리턴을 제거하는 것입니다. 크지는 않지만 실제 코드 통계학자가 되려면 여러 줄 주석의 통계를 해결해야 합니다

# -*- coding: utf-8 -*-
"""
只能统计单行注释的py文件
"""
def parse(path):
 comments = 0
 blanks = 0
 codes = 0
 with open(path, encoding='utf-8') as f:
 for line in f.readlines():
  line = line.strip()
  if line == "":
  blanks += 1
  elif line.startswith("#"):
  comments += 1
  else:
  codes += 1
 return {"comments": comments, "blanks": blanks, "codes": codes}
if name == 'main':
 print(parse("xxx.py"))
로그인 후 복사
여러 줄 주석이 포함된 py 파일을 계산할 수 있습니다

# -*- coding: utf-8 -*-
"""
로그인 후 복사
위의 네 번째 경우에서 여러 줄 주석 기호가 나타나면 in_multi_comment 핵심 작업은 식별자를 단순히 False 또는 True로 설정하는 것이 아니라 식별자를 무효화하는 것입니다. 처음으로 """를 만나면 True이고, 두 번째로 """를 만나면 여러 줄 주석의 끝 문자입니다. 부정은 False입니다. 시작하고 부정은 다시 True입니다. 그럼 다른 언어에서 구문 분석 기능을 다시 작성해야 하는지 확인하려면? 잘 관찰해보면 다줄 주석의 4가지 상황은 4가지 판단 조건을 추상화할 수 있는데, 대부분의 언어에는 한 줄 주석과 다줄 주석이 있지만 그 기호가 다르기 때문이다.
"""
def parse(path):
 in_multi_comment = False # 多行注释符标识符号
 comments = 0
 blanks = 0
 codes = 0
 with open(path, encoding="utf-8") as f:
 for line in f.readlines():
  line = line.strip()
  # 多行注释中的空行当做注释处理
  if line == "" and not in_multi_comment:
  blanks += 1
  # 注释有4种
  # 1. # 井号开头的单行注释
  # 2. 多行注释符在同一行的情况
  # 3. 多行注释符之间的行
  elif line.startswith("#") or \
    (line.startswith('"""') and line.endswith('"""') and len(line)) > 3 or \
   (line.startswith("'''") and line.endswith("'''") and len(line) > 3) or \
   (in_multi_comment and not (line.startswith('"""') or line.startswith("'''"))):
  comments += 1
  # 4. 多行注释符的开始行和结束行
  elif line.startswith('"""') or line.startswith("'''"):
  in_multi_comment = not in_multi_comment
  comments += 1
  else:
  codes += 1
 return {"comments": comments, "blanks": blanks, "codes": codes}
if name == 'main':
 print(parse("xxx.py"))
로그인 후 복사
cond1 ~ cond4에 해당하는 모든 언어의 한 줄 및 여러 줄 주석 기호를 표시하려면 하나의 구성 상수만 필요합니다. 남은 작업은 여러 파일을 구문 분석하는 것인데, 이는 os.walk 메서드를 사용하여 수행할 수 있습니다.

CONF = {"py": {"start_comment": ['"""', "'''"], "end_comment": ['"""', "'''"], "single": "#"},
 "java": {"start_comment": ["/*"], "end_comment": ["*/"], "single": "//"}}
start_comment = CONF.get(exstansion).get("start_comment")
end_comment = CONF.get(exstansion).get("end_comment")
cond2 = False
cond3 = False
cond4 = False
for index, item in enumerate(start_comment):
 cond2 = line.startswith(item) and line.endswith(end_comment[index]) and len(line) > len(item)
 if cond2:
 break
for item in end_comment:
 if line.startswith(item):
 cond3 = True
 break
for item in start_comment+end_comment:
 if line.startswith(item):
 cond4 = True
 break
if line == "" and not in_multi_comment:
 blanks += 1
# 注释有4种
# 1. # 井号开头的单行注释
# 2. 多行注释符在同一行的情况
# 3. 多行注释符之间的行
elif line.startswith(CONF.get(exstansion).get("single")) or cond2 or \
 (in_multi_comment and not cond3):
 comments += 1
# 4. 多行注释符分布在多行时,开始行和结束行
elif cond4:
 in_multi_comment = not in_multi_comment
 comments += 1
else:
 codes += 1
로그인 후 복사
물론, 명령줄 구문 분석과 지정된 매개변수를 기반으로 특정 언어만 구문 분석하는 등 이 프로그램을 완성하려면 아직 해야 할 일이 많습니다.

보충:

코드 줄 계산 도구의 Python 구현

우리는 종종 프로젝트의 코드 줄 수를 세고 싶지만, 더 완전한 계산 기능을 원한다면 그리 간단하지 않을 수도 있습니다. 오늘은 Python을 사용하여 코드라인 통계 도구를 구현하는 방법에 대해 살펴보겠습니다. 아이디어:

먼저 모든 파일을 가져온 다음 각 파일의 코드 줄 수를 계산하고 마지막으로 줄 수를 추가합니다.

기능 구현:

统计每个文件的行数;
统计总行数;
统计运行时间;
支持指定统计文件类型,排除不想统计的文件类型;
递归统计文件夹下包括子文件件下的文件的行数;

排除空行;

# coding=utf-8
import os
import time
basedir = '/root/script'
filelists = []
# 指定想要统计的文件类型
whitelist = ['php', 'py']
#遍历文件, 递归遍历文件夹中的所有
def getFile(basedir):
 global filelists
 for parent,dirnames,filenames in os.walk(basedir):
  #for dirname in dirnames:
  # getFile(os.path.join(parent,dirname)) #递归
  for filename in filenames:
   ext = filename.split('.')[-1]
   #只统计指定的文件类型,略过一些log和cache文件
   if ext in whitelist:
    filelists.append(os.path.join(parent,filename))
#统计一个文件的行数
def countLine(fname):
 count = 0
 for file_line in open(fname).xreadlines():
  if file_line != '' and file_line != '\n': #过滤掉空行
   count += 1
 print fname + '----' , count
 return count
if name == 'main' :
 startTime = time.clock()
 getFile(basedir)
 totalline = 0
 for filelist in filelists:
  totalline = totalline + countLine(filelist)
 print 'total lines:',totalline
 print 'Done! Cost Time: %0.2f second' % (time.clock() - startTime)
로그인 후 복사

结果:

[root@pythontab script]# python countCodeLine.py
/root/script/test/gametest.php---- 16
/root/script/smtp.php---- 284
/root/script/gametest.php---- 16
/root/script/countCodeLine.py---- 33
/root/script/sendmail.php---- 17
/root/script/test/gametest.php---- 16
total lines: 382
Done! Cost Time: 0.00 second
[root@pythontab script]#

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

怎么对numpy里数组元素赋统一的值

numpy数组与矩阵的乘法怎么使用

위 내용은 Python에서 코드 통계 도구를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿