Here’s silly (and long) Python script I wrote a while back to count the number of lines in files recursively through a dir. (I guess I was fed up with ‘find ../ -iname “*cpp” | xargs wc -l” or just utterly bored or using Windows…)
#!/usr/bin/python
#
# Usage:
# ./count_lines.py [path_to_dir_or_file]
__author__ = "Rui Barbosa Martins (ruibmartins@gmail.com)"
import optparse
import os.path
import sys
def getNumberOfLines(filePath):
fp = file(filePath, "r");
numberOfLines = len(fp.readlines())
fp.close()
return numberOfLines
def visit((fileTypesIncluded, files), dirname, names):
for f in names:
filePath = os.path.join(dirname, f)
if (fileTypesIncluded == ["*"] or
filter(lambda fe: f.endswith(fe), fileTypesIncluded)) and
os.path.isfile(filePath):
files[filePath] = getNumberOfLines(filePath)
def main(startPath, fileTypesIncluded):
if not os.path.exists(startPath):
print "Error: Path [%s] does not exist." % (startPath)
sys.exit(-1)
elif os.path.isfile(startPath):
files = {startPath: getNumberOfLines(startPath)}
else:
fileTypes = "|".join(fileTypesIncluded)
absPath = os.path.abspath(startPath)
print "Searching for extensions '%s' in '%s'." % (fileTypes, absPath)
files = {}
os.path.walk(startPath, visit, (fileTypesIncluded, files))
keys = files.keys()
keys.sort()
total = 0
longestLength = 0
groups = {}
for key in keys:
if longestLength < len(key):
longestLength = len(key)
for key in keys:
spaces = " " * (longestLength - len(key))
print "%s%s %d" % (key, spaces , files[key])
total = total + files[key]
if len(keys) > 1:
print "Total lines of code: %d" % (total)
def parseArgs():
usage = "Usage: %prog [Options] FILE_OR_DIRECTORY"
parser = optparse.OptionParser(usage=usage)
parser.add_option("-f", "--file_extensions", dest="file_extensions",
help="File extensions to count in. (comma separated)",
metavar="FILE_TYPES",
default=[".*"])
(options, args) = parser.parse_args()
fe = options.file_extensions
if not args:
path = "."
elif len(args) == 1:
path = args[0]
else:
parser.print_help()
print "Error: Too many paths provided. Only one expected."
sys.exit(0)
if type(fe) == str:
fe = map(lambda s: s.strip(), fe.split(","))
if not fe or filter(lambda s: "*" in s, fe):
fe = ["*"]
return path, fe
if __name__ == "__main__":
main(*parseArgs())