python目录遍历和删除指定目录下的pyc文件

来源:互联网 发布:linux shell 权限不够 编辑:程序博客网 时间:2024/04/29 03:53

在提交版本库的时候需要清除工作目录下的pyc文件,在《python cookbook》2.16节中提供了一种遍历目录树并找出指定文件的方法,可以利用这个清除工作目录下的pyc文件。

我做了简单的注释,并在pattern的调用中加入了strip方法以去除其两端的空格,来防止patterns字符串在以分号分割的同时因存在空格而无法匹配的情况。

#!/user/bin/python# -*- coding: utf-8 -*-# Filename: allfile.py# Date:2011-03-26import osimport fnmatchdef all_file(root, patterns='*',single_level=False, yield_folders=False):"""root: 需要遍历的目录patterns: 需要查找的文件,以;为分割的字符串single_level: 是否只遍历单层目录,默认为否yield_folders: 是否包含目录本身,默认为否"""patterns = patterns.split(';')for path, subdirs, files in os.walk(root):if yield_folders:files.extend(subdirs)files.sort()for name in files:for pattern in patterns:if fnmatch.fnmatch(name, pattern.strip()):# 去除pattern两端的空格yield os.path.join(path, name)if single_level:break

os.walk

os.walk是一个generator函数。每次可以得到一个三元tupple,其中第一个为起始路径,第二个为起始路径下的文件夹,第三个是起始路径下的文件。举例如下:

>>> x=os.walk('/home/tiny/workspace/py')>>> x<generator object walk at 0x8ef652c>>>>for i in x:... i... ('/home/tiny/workspace/py', ['2', '1'], ['.allfile.py.swp', 'allfile.py', 'list_get.py', 'test.py', 'tags', 'log.txt'])('/home/tiny/workspace/py/2', [], ['fib.py', 'djcoding.py', 'drectory_travel.py', 'foo.py'])('/home/tiny/workspace/py/1', [], ['timetest2.py', 'timetest.py'])

fnmatch 实现shell风格模式匹配特定字符

  • fnmatch.fnmatch( namespattern):测试name是否匹配pattern,返回true/false。下面的例子列出了当前目录中的所有py文件:
>>>import fnmatch>>>import os>>>for file in os.listdir('.'):... if fnmatch.fnmatch(file, '*.py'):... print file... allfile.pylist_get.pytest.py



如果操作系统是大小写不敏感的,则在fnmatch.fnmatch()中所有的参数将被统一格式为所有大写或所有小写。

>>> files=['tags', 'readme.txt', 'allfile.py', 'test.py']>>> fnmatch.filter(files, '*.py')['allfile.py', 'test.py']>>> fnmatch.filter(files, '[tx]')[]>>> fnmatch.filter(files, '[tx]*')['tags', 'test.py']>>> fnmatch.filter(files, '[tr]*')['tags', 'readme.txt', 'test.py']>>> fnmatch.filter(files, '*[tr]*')['tags', 'readme.txt', 'test.py']>>> fnmatch.filter(files, '?[a]*')['tags']


  • fnmatch.fnmatchcase ( namespattern): 与平台无关的大小写敏感的fnmatch.fnmatch
  • fnmatch.filter( namespattern):实现列表特殊字符的过滤或筛选,返回符合匹配模式的字符列表,例:


注意: [seq] 匹配单个seq中的任意单个字符

  • fnmatch.translate(pattern):翻译模式, fnmatch将这种全局模式转换成一个正则式, 然后使用re模块来比较名字和模式。 translate() 函数是一个公共API用于将全局模式转换成正则式。
>>>import fnmatch>>> pattern='*.py'>>>print fnmatch.translate(pattern).*\.py\Z(?ms)


  • unix shell风格匹配方式
  1. *表示匹配任何单个或多个字符
  2. ?表示匹配单个字符
  3. [seq] 匹配单个seq中的任意单个字符
  4. [!seq]匹配单个不是seq中的任意单个字符

回到开始,删除pyc文件

os.remove()可以删除指定文件,参见文档。删除pyc可以在以上遍历的基础上加入代码:if__name__=='__main__':for path in all_file(os.getcwd(),'*.pyc'):print pathos.remove(path)os.getcwd() 是获取当前文件夹,也可以用指定目录代替,如;'\home'.



转载请注明出处:http://www.cnblogs.com/moinmoin/