使用Python处理目录(二):计算某个目录下特定文件类型中文件总行数
使用Python处理目录(二):计算某个目录下特定文件类型中文件总行数
计算某个目录下特定文件的行数,从文件中读入配置参数,计算结果输出到文件指定文件:
该功能是基于第一篇系列文章《打印目录下的文件名》的基础上加以修改得到的,主要的逻辑是遍历目录下的文件,然后读取文件中的内容,计算行数。
为了方便修改配置,本文中的代码所需要的配置都是从文件中读取的。FilePath
标识文件路径,patterns
, single_level
同第一篇文章中的功能一样。exceptFile
指的是需要排除的目录,目的是将指定目录下特定的子目录不作为搜索计算的目录。outDir
表示统计结果打印的输出文件。
代码中频繁调用的.rstrip('\n')
目的是将文件中的 某一行的换行符去掉。
GetCommonElements
目的是取两个集合的交集
computerLineNum
计算某个文件有多少行,该函数利用了文件对象的enumerate
轻松的将文本行数统计了出来。
import fnmatch, os
FilePath = ''
patterns = ''
single_level = False
exceptFile = 'build;Depend'
outDir = ''
def ReadAllConfig(filename = 'Config.txt'):
fileObj = open(filename, 'rU')
global FilePath
global patterns
global single_level
global exceptFile
global outDir
FilePath, patterns, single_level1, exceptFile, outDir= fileObj.readlines()[:]
FilePath = FilePath.rstrip('\n')
patterns = patterns.rstrip('\n')
exceptFile = exceptFile.rstrip('\n')
single_level1 = single_level1.rstrip('\n')
outDir = outDir.rstrip('\n')
if single_level1 == 'False':
single_level = False
else:
single_level = True
def GetCommonElements(firstSet, secondSet):
return set(firstSet).intersection(set(secondSet))
def allFiles(root, patterns = '*.cpp;*.h', single_level = False,
yield_folders = False, exceptFile = ""):
patterns = patterns.split(';')
excpetFiles = exceptFile.split(';')
for path, subdirs, files in os.walk(root):
lastDirs = path.split('\\')
newSet = GetCommonElements(lastDirs, excpetFiles)
if len(newSet) != 0:
continue
if yield_folders:
#add subdirs to the tail of files
files.extend(subdirs)
files.sort()
for name in files:
for pattern in patterns:
if fnmatch.fnmatch(name, pattern):
yield os.path.join(path, name)
break
#only deal one level of the dir
if single_level:
break
def computerLineNum(strFileName):
fileObj = open(strFileName, 'rU')
count = 0
for count, LineContent in enumerate(fileObj):
pass
return count + 1
def ComputerFilesTotalLineNumsInDir(dirName, outDir1):
TotalCount = 0
dirName = os.path.normpath(dirName)
fileObj1 = open(outDir1, 'w')
for name in allFiles(dirName, patterns = patterns,
exceptFile = exceptFile):
count = computerLineNum(name)
str1 = 'the line of the file %s is : %d'%(name, count)
print(str1)
fileObj1.write(str1)
TotalCount += count
str1 = 'the total line count of the dir %s is %d:'%(dirName, TotalCount)
print(str1)
fileObj1.write(str1)
fileObj1.close()
if __name__ == "__main__":
ReadAllConfig()
ComputerFilesTotalLineNumsInDir(FilePath, outDir)
评论关闭