« »
2008-08-21Python

371

Python:统计一个目录下的所有文件数和行数

包括三个函数:
统计单个文件行数的函数line_count()
统计一个目录下的所有文件file_count()
统计一个目录下的所有文件的行数count_all_lines()
添加了一个简单过滤机制,以便统计特定文件类型的行数。

  1. # -*- coding: utf-8 -*-
  2. import time
  3. import os
  4. from datetime import datetime
  5. from datetime import timedelta
  6.  
  7. def line_count(filename):
  8.     '''Count file's lines neglect '\n' '''
  9.     count=0
  10.     #print filename
  11.     for line in open(filename):
  12.         if(line!='\n'):count+=1
  13.     return count
  14.  
  15. def file_count(dirname,filter_types=[]):
  16.     '''Count the files in a directory includes its subfolder's files
  17.        You can set the filter types to count specific types of file'''
  18.     count=0
  19.     filter_is_on=False
  20.     if filter_types!=[]: filter_is_on=True
  21.     for item in os.listdir(dirname):
  22.         abs_item=os.path.join(dirname,item)
  23.         #print item
  24.         if os.path.isdir(abs_item):
  25.             #Iteration for dir
  26.             count+=file_count(abs_item,filter_types)
  27.         elif os.path.isfile(abs_item):
  28.             if filter_is_on:
  29.                 #Get file's extension name
  30.                 extname=os.path.splitext(abs_item)[1]
  31.                 if extname in filter_types:
  32.                     count+=1
  33.             else:
  34.                 count+=1
  35.     return count
  36. def file_changed_count(dirname,base_time,filter_types=[]):
  37.     '''Count the files in a directory includes its subfolder's files.
  38.        You can set the filter types to count specific types of file.
  39.        And set basetiem to count the file if it's modified time is over base_time'''
  40.     count=0
  41.     filter_is_on=False
  42.     if filter_types!=[]: filter_is_on=True
  43.     for item in os.listdir(dirname):
  44.         abs_item=os.path.join(dirname,item)
  45.         if os.path.isdir(abs_item):
  46.             #Iteration for dir
  47.             count+=file_count(abs_item,filter_types)
  48.         elif os.path.isfile(abs_item):
  49.             mt=datetime.fromtimestamp(os.stat(abs_item)[8])
  50.             if mt>base_time:
  51.                 if filter_is_on:
  52.                     #Get file's extension name
  53.                     extname=os.path.splitext(abs_item)[1]
  54.                     if extname in filter_types:
  55.                         count+=1
  56.                 else:
  57.                     count+=1
  58.     return count
  59.  
  60. def count_all_lines(dirname,filter_types=[]):
  61.     '''Count all files' lines of specific types in one directory includes its
  62.        subdirectories.'''
  63.     count=0
  64.     filter_is_on=False
  65.     if filter_types!=[]: filter_is_on=True
  66.  
  67.     for item in os.listdir(dirname):
  68.         abs_item=os.path.join(dirname,item)
  69.         if os.path.isdir(abs_item):
  70.             count+=count_all_lines(abs_item,filter_types)
  71.         elif os.path.isfile(abs_item):
  72.             if filter_is_on:
  73.                 #Get file's extension name
  74.                 extname=os.path.splitext(abs_item)[1]
  75.                 if extname in filter_types:
  76.                     count+=line_count(abs_item)
  77.             else:
  78.                 count+=line_count(abs_item)
  79.     return count
  80.  
  81.  
  82. if __name__=='__main__':
  83.  
  84.     s=time.clock()
  85.     srcdir=r"C:\work"
  86.     #Set file's filter types
  87.     cs_type=['.cs']
  88.     pas_type=['.pas']
  89.     filter_types=['.pas']
  90.  
  91.     #count=file_count(srcdir,filter_types)
  92.     print 'Counting ...'
  93.     base_time=datetime.now()-timedelta(1)
  94.     #count=count_all_lines(srcdir,base_time)
  95.     cc=file_count(srcdir,filter_types)
  96.     #count=count_all_lines(srcdir,filter_types)
  97.  
  98.     print cc
  99.     s=time.clock()-s
  100.     print 'Time is : %.2f seconds'%s

您还可能感兴趣的内容

日志信息 »

该日志于2008-08-21 16:10由 x72 发表在Python分类下, 你可以发表评论。除了可以将这个日志以保留源地址及作者的情况下引用到你的网站或博客,还可以通过RSS 2.0订阅这个日志的所有评论。

没有评论

发表评论 »


返回顶部