1. 程式人生 > >統計專案的程式碼行數(python處女作)

統計專案的程式碼行數(python處女作)

前些日子做了個小專案,特別想知道自己編了多少的程式碼量,我就想弄個小程式統計一下程式碼行,想起曾經統計程式碼行用的方法是全部匯入到Eclipse專案中,然後用正則表示式匹配。eclipse -> search -> file -> 勾選regular expression後,使用的正則表示式如下:

所有行
\n 或者 .*\n
除去空白行
^.*\S.*$

But~~~我現在重灌系統了,沒有eclipse了,做的專案也無法匯入eclipse的,於是,我呼喚更通用的辦法。就是編寫一個小程式,而統計程式碼行涉及的工作確實很多,包括:

  • 檔案樹遍歷
  • 字串操作(去掉無需統計的第三方庫,圖片檔案等)
  • 檔案行數的統計

用C或者C++都比較麻煩,於是我就各種學習,查資料,弄了小菜鳥的第一個python程式。安裝步驟省略(各種下一步),然後配置環境變數中的Path值,加入安裝Python的根目錄,比如:C:\Python32。在cmd中輸入python出現版本號資訊,則證明安裝成功了。

(以下基於Python版本3.2.3)

首先,離不開一個os.walk函式的幫忙,分析一下os.walk函式的用法

假設資料夾結構如圖:


import os

if(__name__=='__main__'):
	for root,dirs,files in os.walk('A'):
		print (root, dirs, files)

結果為:

E:\technology\python\code>python listfile.py
A ['B', 'D'] []
A\B ['C'] []
A\B\C [] []
A\D [] []

可以看出,這個函式就可以實現檔案目錄樹的遞迴遍歷了。

怎麼實現檔案目錄樹的有選擇的遍歷呢?


紅叉的檔案表示不需要遍歷的檔案

執行下面程式碼可以列出所有檔名:

import os

if(__name__=='__main__'):
	for root,dirs,files in os.walk('A'):
		for afile in files:
			print (root + os.sep + afile)

結果:

E:\technology\python\code>python listfile.py
A\B\img.png		=〉無需統計
A\B\test.py		=〉需統計
A\B\txt.txt		=〉無需統計
A\E\test.py		=〉無需統計

下面使用split函式和in操作符來實現檔名的篩選

import os

if(__name__=='__main__'):
	for root,dirs,files in os.walk('A'):
		if(root in ['A'+os.sep+'E']):
			continue
		for afile in files:
			ext=afile.split('.')
			ext=ext[-1]
			if(ext in ['py']):
				print (root+os.sep+afile)

列印結果正是我們需要的:

E:\technology\python\code>python listfile.py
A\B\test.py

空行的判斷可以藉助一個拆分字串的函式split。空行.split()會返回False。如下:

>>> (bool)("".split())
False
>>> (bool)("d".split())
True
>>> (bool)("   ".split())
False

因此判斷一個檔案行數的函式可以定義如下:

def afileline(f_path):
	res=0
	f=open(f_path)
	for lines in f:
		if(lines.split()):
			res+=1
	return res

好啦,基本上基礎的東西都已經差不多了。首先,修改遞迴遍歷的檔案,使其不包含PHPExcel庫,adodb5庫,以及jquery, jquery等指令碼,如下:

import os

if(__name__=='__main__'):
	host='C:'+os.sep+'wamp'+os.sep+'www'+os.sep+'mydms'
	for root,dirs,files in os.walk(host):
		if(root.startswith(host+os.sep+'adodb5')):
			continue
		if(root.startswith(host+os.sep+'core\PHPExcel')):
			continue
		if(root.startswith(host+os.sep+'ext\editor')):
			continue
		for afile in files:
			if(afile in ['PHPExcel.php', 'jquery-1.5.2.js', 'jquery-ui.js','jquery-ui.css','timer.js']):
				continue
			ext=afile.split('.')
			ext=ext[-1]
			if(ext in ['php','css','js','html']):
				print (root+os.sep+afile)

把輸出重定向到檔案,

E:\technology\python\code>python listfile.py > allfiles.txt

看一看,基本上剩下的檔案都是我自己寫的了。


最後,把兩部分程式碼融合起來就可以統計總的程式碼行以及不含空行的程式碼行和統計程式碼檔案個數啦。

import sys,os

def afileline(f_path):
	res=0
	f=open(f_path,"r",1,"utf8")
	for lines in f:
		if(lines.split()):
			res+=1
	return res

if(__name__=='__main__'):
	host='C:'+os.sep+'wamp'+os.sep+'www'+os.sep+'mydms'
	allline=0
	allfiles=0
	for root,dirs,files in os.walk(host):
		if(root.startswith(host+os.sep+'adodb5')):
			continue
		if(root.startswith(host+os.sep+'core\PHPExcel')):
			continue
		if(root.startswith(host+os.sep+'ext\editor')):
			continue
		for afile in files:
			if(afile in ['PHPExcel.php', 'jquery-1.5.2.js', 'jquery-ui.js','jquery-ui.css','timer.js']):
				continue
			ext=afile.split('.')
			ext=ext[-1]
			if(ext in ['php','css','js','html']):
				itpath=root+os.sep+afile
				allfiles+=1
				allline+=afileline(itpath)
	print ('Total lines:',allline)
	print ('Total: ',allfiles)

呵呵,終於知道了,我做的小專案有1萬4千行程式碼(除去空行),呵呵。