使用Python处理目录(二):计算某个目录下特定文件类型中文件总行数


计算某个目录下特定文件的行数,从文件中读入配置参数,计算结果输出到文件指定文件:
该功能是基于第一篇系列文章《打印目录下的文件名》的基础上加以修改得到的,主要的逻辑是遍历目录下的文件,然后读取文件中的内容,计算行数。

为了方便修改配置,本文中的代码所需要的配置都是从文件中读取的。FilePath标识文件路径,patternssingle_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)

评论关闭