Entwerfen Sie ein Code-Statistiktool mit Python

不言
Freigeben: 2018-04-04 16:57:57
Original
1388 Leute haben es durchsucht

In diesem Artikel werden hauptsächlich relevante Informationen zur Verwendung von Python zum Entwerfen eines Codestatistiktools vorgestellt, einschließlich der Anzahl der Dateien, der Anzahl der Codezeilen, der Anzahl der Kommentarzeilen und der Anzahl der Leerzeilen. Interessierte Freunde, bitte folgen Sie dem Herausgeber von Script House, um einen Blick darauf zu werfen

Frage

Entwerfen Sie ein Programm zum Zählen der Statistiken eines Projekts Anzahl der Codezeilen, einschließlich der Anzahl der Dateien, Codezeilen, Anzahl der Kommentarzeilen und Anzahl der Leerzeilen. Versuchen Sie, beim Design flexibler zu sein, indem Sie verschiedene Parameter eingeben, um Elemente in verschiedenen Sprachen zu zählen, zum Beispiel:

# type用于指定文件类型
python counter.py --type python
Nach dem Login kopieren

Ausgabe:

Dateien:10
Codezeilen:200
Kommentare:100
Leerzeichen:20

Analyse

Dies ist eine Designfrage, die sehr einfach aussieht, aber etwas kompliziert zu lösen ist. Wir können das Problem verkleinern, solange wir die Anzahl der Codezeilen in einer Datei korrekt zählen können ist kein Problem. Am Beispiel von Python gibt es folgende Situationen: Einzeilige Kommentare, die mit einem Nummernzeichen beginnen

# Einzeilige Kommentare

2. Wenn sich mehrzeilige Kommentare in derselben Zeile befinden

""Dies ist ein mehrzeiliger Kommentar""

'''Dies ist auch ein mehrzeiliger Kommentar'''

3. Mehrzeilige Kommentare


"""
Diese drei Zeilen sind alles Kommentarsymbole

"""


Unsere Idee ist, mehrzeilige Kommentare zeilenweise zu analysieren. In_multi_comment ist eine zusätzliche Kennung erforderlich, um festzustellen, ob sich die aktuelle Zeile in einem mehrzeiligen Kommentar befindet. Es wird auf „True“ gesetzt, und wenn der nächste mehrzeilige Kommentar auftritt, wird es auf „False“ gesetzt. Der Code zwischen dem Startsymbol eines mehrzeiligen Kommentars und dem nächsten Schlusssymbol sollte zur kommentierten Zeile gehören.

Wissenspunkte

Wie man Dateien richtig liest, Dateien bei der String-Verarbeitung liest, gängige Methoden von Strings

Vereinfachte Version

Wir iterieren Schritt für Schritt und implementieren zunächst eine vereinfachte Version des Programms, die nur eine einzige Datei Python-Code zählt und keine Mehrzeilen berücksichtigt Kommentare In diesem Fall handelt es sich um eine Funktion, die jeder erreichen kann, der mit Python begonnen hat. Der entscheidende Punkt ist, dass Sie nach dem Lesen jeder Zeile zunächst die Methode strip() verwenden, um die Leerzeichen und Wagenrückläufe auf beiden Seiten der Zeichenfolge

<🎜 zu entfernen >
# -*- coding: utf-8 -*-
"""
只能统计单行注释的py文件
"""
def parse(path):
 comments = 0
 blanks = 0
 codes = 0
 with open(path, encoding=&#39;utf-8&#39;) 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__ == &#39;__main__&#39;:
 print(parse("xxx.py"))
Nach dem Login kopieren

Mehrzeilige Kommentarversion

Wenn Sie nur den Code von einzeiligen Kommentaren zählen können, ist dies nur von geringer Bedeutung, wenn Sie die Statistik von mehrzeiligen Kommentaren lösen -Zeilen-Kommentare können als echter Code-Statistiker betrachtet werden

Kann Py-Dateien zählen, die mehrzeilige Kommentare enthalten
# -*- coding: utf-8 -*-
"""
Nach dem Login kopieren

Im vierten Fall oben besteht die Schlüsseloperation darin, die in_multi_comment-Kennung zu invertieren, anstatt sie einfach auf False oder True zu setzen Wenn es auf „“ trifft, ist es wahr, und wenn es zum zweiten Mal auf „“ trifft, ist es das Endzeichen des mehrzeiligen Kommentars, und die Negation ist falsch usw. Das Beim dritten Mal ist es der Anfang, die Verneinung ist wieder wahr.
"""
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(&#39;"""&#39;) and line.endswith(&#39;"""&#39;) and len(line)) > 3 or \
   (line.startswith("&#39;&#39;&#39;") and line.endswith("&#39;&#39;&#39;") and len(line) > 3) or \
   (in_multi_comment and not (line.startswith(&#39;"""&#39;) or line.startswith("&#39;&#39;&#39;"))):
  comments += 1
  # 4. 多行注释符的开始行和结束行
  elif line.startswith(&#39;"""&#39;) or line.startswith("&#39;&#39;&#39;"):
  in_multi_comment = not in_multi_comment
  comments += 1
  else:
  codes += 1
 return {"comments": comments, "blanks": blanks, "codes": codes}
if __name__ == &#39;__main__&#39;:
 print(parse("xxx.py"))
Nach dem Login kopieren

Wie kann man also beurteilen, ob andere Sprachen eine Analysefunktion neu schreiben müssen? Wenn Sie genau hinschauen, können die vier Situationen mehrzeiliger Kommentare vier Beurteilungsbedingungen abstrahieren, da die meisten Sprachen einzeilige Kommentare und mehrzeilige Kommentare haben, ihre Symbole jedoch unterschiedlich sind.

Es ist nur eine Konfigurationskonstante erforderlich, um die Symbole einzeiliger und mehrzeiliger Kommentare in allen Sprachen zu markieren, entsprechend cond1 bis cond4. . Die verbleibende Aufgabe besteht darin, mehrere Dateien zu analysieren, was mit der Methode os.walk erfolgen kann.
CONF = {"py": {"start_comment": [&#39;"""&#39;, "&#39;&#39;&#39;"], "end_comment": [&#39;"""&#39;, "&#39;&#39;&#39;"], "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
Nach dem Login kopieren

Wenn Sie dieses Programm perfektionieren möchten, gibt es natürlich noch viel zu tun, einschließlich der Befehlszeilenanalyse und nur der Analyse ein bestimmter Parameter basierend auf der angegebenen Parametersprache.
def counter(path):
 """
 可以统计目录或者某个文件
 :param path:
 :return:
 """
 if os.path.isdir(path):
 comments, blanks, codes = 0, 0, 0
 list_dirs = os.walk(path)
 for root, dirs, files in list_dirs:
  for f in files:
  file_path = os.path.join(root, f)
  stats = parse(file_path)
  comments += stats.get("comments")
  blanks += stats.get("blanks")
  codes += stats.get("codes")
 return {"comments": comments, "blanks": blanks, "codes": codes}
 else:
 return parse(path)
Nach dem Login kopieren

Ergänzung:

Python-Implementierung des Codezeilen-Zähltools

Das wollen wir oft count Die Anzahl der Codezeilen des Projekts. Wenn Sie jedoch eine umfassendere Statistikfunktion wünschen, ist dies möglicherweise nicht so einfach. Heute werfen wir einen Blick darauf, wie Sie mit Python ein Codezeilen-Statistiktool implementieren.

Idee:

Besorgen Sie sich zuerst alle Dateien, zählen Sie dann die Anzahl der Codezeilen in jeder Datei und addieren Sie schließlich die Anzahl der Zeilen.

Implementierte Funktionen:

Zählen Sie die Anzahl der Zeilen in jeder Datei.
Zählen Sie die Gesamtzahl der Zeilen.
Spezifizierte statistische Dateitypen unterstützen, Dateitypen ausschließen, die nicht gezählt werden sollen;

Rekursiv die Anzahl der Dateizeilen unter dem Ordner zählen, einschließlich Unterdateien;



Leerzeichen ausschließen Zeilen;


# coding=utf-8
import os
import time
basedir = &#39;/root/script&#39;
filelists = []
# 指定想要统计的文件类型
whitelist = [&#39;php&#39;, &#39;py&#39;]
#遍历文件, 递归遍历文件夹中的所有
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(&#39;.&#39;)[-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 != &#39;&#39; and file_line != &#39;\n&#39;: #过滤掉空行
   count += 1
 print fname + &#39;----&#39; , count
 return count
if __name__ == &#39;__main__&#39; :
 startTime = time.clock()
 getFile(basedir)
 totalline = 0
 for filelist in filelists:
  totalline = totalline + countLine(filelist)
 print &#39;total lines:&#39;,totalline
 print &#39;Done! Cost Time: %0.2f second&#39; % (time.clock() - startTime)
Nach dem Login kopieren

Ergebnis:

[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
Gesamtzeilen: 382
Fertig! Kostenzeit: 0,00 Sekunden
[root@pythontab script]#



Zählt nur PHP- und Python-Dateien, Das ist sehr praktisch.

Verwandte Empfehlungen:

Vollständige Beispielfreigabe der Python-Design-Rechner-Funktionsimplementierung

Besucher und Beobachtungen in der Python-Designmusterprogrammierung Einführung in den Benutzer Modusbeispiele


Das obige ist der detaillierte Inhalt vonEntwerfen Sie ein Code-Statistiktool mit Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!