亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用Python設計一個代碼統計工具

 更新時間:2018年04月04日 10:36:47   作者:FOOFISH-PYTHON之禪  
這篇文章主要介紹了使用Python設計一個代碼統計工具的相關資料,包括文件個數,代碼行數,注釋行數,空行行數。感興趣的朋友跟隨腳本之家小編一起看看吧

問題

設計一個程序,用于統計一個項目中的代碼行數,包括文件個數,代碼行數,注釋行數,空行行數。盡量設計靈活一點可以通過輸入不同參數來統計不同語言的項目,例如:

# type用于指定文件類型
python counter.py --type python

輸出:

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

分析

這是一個看起來很簡單,但做起來有點復雜的設計題,我們可以把問題化小,只要能正確統計一個文件的代碼行數,那么統計一個目錄也不成問題,其中最復雜的就是關于多行注釋,以 Python 為例,注釋代碼行有如下幾種情況:

1、井號開頭的單行注釋

# 單行注釋

2、多行注釋符在同一行的情況

"""這是多行注釋"""
'''這也是多行注釋'''
3、多行注釋符

"""
這3行都是注釋符
"""

我們的思路采取逐行解析的方式,多行注釋需要一個額外的標識符in_multi_comment 來標識當前行是不是處于多行注釋符當中,默認為 False,多行注釋開始時,置為 True,遇到下一個多行注釋符時置為 False。從多行注釋開始符號直到下一個結束符號之間的代碼都應該屬于注釋行。

知識點

如何正確讀取文件,讀出的文件當字符串處理時,字符串的常用方法

簡化版

我們逐步進行迭代,先實現一個簡化版程序,只統計Python代碼的單文件,而且不考慮多行注釋的情況,這是任何入門 Python 的人都能實現的功能。關鍵地方是把每一行讀出來之后,先用 strip() 方法把字符串兩邊的空格、回車去掉

# -*- 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"))

多行注釋版

如果只能統計單行注釋的代碼,意義并不大,要解決多行注釋的統計才能算是一個真正的代碼統計器

# -*- coding: utf-8 -*-
"""

可以統計包含有多行注釋的py文件

"""
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"))

上面的第4種情況,遇到多行注釋符號時,in_multi_comment 標識符進行取反操作是關鍵操作,而不是單純地置為 False 或 True,第一次遇到 """ 時為True,第二次遇到 """ 就是多行注釋的結束符,取反為False,以此類推,第三次又是開始,取反又是True。

那么判斷其它語言是不是要重新寫一個解析函數呢?如果你仔細觀察的話,多行注釋的4種情況可以抽象出4個判斷條件,因為大部分語言都有單行注釋,多行注釋,只是他們的符號不一樣而已。

CONF = {"py": {"start_comment": ['"""', "'''"], "end_comment": ['"""', "'''"], "single": "#"},
 "java": {"start_comment": ["/*"], "end_comment": ["*/"], "single": "http://"}}
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

只需要一個配置常量把所有語言的單行、多行注釋的符號標記出來,對應出 cond1到cond4幾種情況就ok。剩下的任務就是解析多個文件,可以用 os.walk 方法。

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)

當然,想要把這個程序做完善,還有很多工作要多,包括命令行解析,根據指定參數只解析某一種語言。

補充:

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和python文件,非常方便。

總結

以上所述是小編給大家介紹的使用Python設計一個代碼統計工具,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

相關文章

  • Python內置函數的用法實例教程

    Python內置函數的用法實例教程

    這篇文章主要介紹了Python內置函數的用法,包括求絕對值的abs()函數及數值類型轉換函數等,需要的朋友可以參考下
    2014-09-09
  • ?Python?匿名函數lambda?詳情

    ?Python?匿名函數lambda?詳情

    這篇文章主要介紹了?Python?匿名函數lambda,??lambda?????函數返回函數本身而不是將其賦值給一個變量名。所以它也被稱為匿名函數,下文更多相關內容需要的小伙伴可以參考一下
    2022-03-03
  • 淺談python3中input輸入的使用

    淺談python3中input輸入的使用

    這篇文章主要介紹了淺談python3中input輸入的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • python爬蟲之bs4數據解析

    python爬蟲之bs4數據解析

    這篇文章主要介紹了python爬蟲之bs4數據解析,文中有非常詳細的代碼示例,對正在學習python爬蟲的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Pytorch參數注冊和nn.ModuleList nn.ModuleDict的問題

    Pytorch參數注冊和nn.ModuleList nn.ModuleDict的問題

    這篇文章主要介紹了Pytorch參數注冊和nn.ModuleList nn.ModuleDict的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Django項目uwsgi+Nginx保姆級部署教程實現

    Django項目uwsgi+Nginx保姆級部署教程實現

    這篇文章主要介紹了Django項目uwsgi+Nginx保姆級部署教程實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • Python基礎 括號()[]{}的詳解

    Python基礎 括號()[]{}的詳解

    這篇文章主要介紹了Python基礎 括號()、[]、{},下面文章將圍繞這三個括號的相關解析展開內容,需要的朋友可以參考一下,洗碗粉對你有所幫助
    2021-11-11
  • Python實現遍歷目錄的方法【測試可用】

    Python實現遍歷目錄的方法【測試可用】

    這篇文章主要介紹了Python實現遍歷目錄的方法,涉及Python針對目錄與文件的遍歷、判斷、讀取相關操作技巧,需要的朋友可以參考下
    2017-03-03
  • Python?中的?Counter?模塊及使用詳解(搞定重復計數)

    Python?中的?Counter?模塊及使用詳解(搞定重復計數)

    Counter 是一個簡單的計數器,用于統計某些可哈希對象的數量。它以字典的形式存儲元素和它們的計數,這篇文章主要介紹了Python?中的?Counter?模塊及使用詳解(搞定重復計數),需要的朋友可以參考下
    2023-04-04
  • Python yield的使用詳解

    Python yield的使用詳解

    您可能聽說過,帶有 yield 的函數在 Python 中被稱之為、generator(生成器),何謂 generator ?我們先拋開 generator,以一個常見的編程題目來展示 yield 的概念
    2021-10-10

最新評論