在提交版本库的时候需要清除工作目录下的pyc文件,在《python cookbook》2.16节中提供了一种遍历目录树并找出指定文件的方法,可以利用这个清除工作目录下的pyc文件。
我做了简单的注释,并在pattern的调用中加入了strip方法以去除其两端的空格,来防止patterns字符串在以分号分割的同时因存在空格而无法匹配的情况。
遍历目录树
#!/user/bin/python
# -*- coding: utf-8 -*-
# Filename: allfile.py
# Date:2011-03-26
import os
import fnmatch
def 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( names, pattern):测试name是否匹配pattern,返回true/false。下面的例子列出了当前目录中的所有py文件:
>>>import fnmatch
>>>import os
>>>for file in os.listdir('.'):
... if fnmatch.fnmatch(file, '*.py'):
... print file
...
allfile.py
list_get.py
test.py
如果操作系统是大小写不敏感的,则在fnmatch.fnmatch()中所有的参数将被统一格式为所有大写或所有小写。
- fnmatch.fnmatchcase ( names, pattern): 与平台无关的大小写敏感的fnmatch.fnmatch
- fnmatch.filter( names, pattern):实现列表特殊字符的过滤或筛选,返回符合匹配模式的字符列表,例:
>>> 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.translate(pattern):翻译模式, fnmatch将这种全局模式转换成一个正则式, 然后使用re模块来比较名字和模式。 translate()
>>>import fnmatch
>>> pattern='*.py'
>>>print fnmatch.translate(pattern)
.*\.py\Z(?ms)
- unix shell风格匹配方式
- *表示匹配任何单个或多个字符
- ?表示匹配单个字符
- [seq] 匹配单个seq中的任意单个字符
- [!seq]匹配单个不是seq中的任意单个字符
回到开始,删除pyc文件
os.remove()可以删除指定文件。删除pyc可以在以上遍历的基础上加入代码:
if__name__=='__main__':
for path in all_file(os.getcwd(),'*.pyc'):
print path
os.remove(path)
os.getcwd() 是获取当前文件夹,也可以用指定目录代替,如;'\home'.