在提交版本库的时候需要清除工作目录下的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( namespattern):测试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 ( namespattern): 与平台无关的大小写敏感的fnmatch.fnmatch
  • fnmatch.filter( namespattern):实现列表特殊字符的过滤或筛选,返回符合匹配模式的字符列表,例:
>>> 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风格匹配方式
  1. *表示匹配任何单个或多个字符
  2. ?表示匹配单个字符
  3. [seq] 匹配单个seq中的任意单个字符
  4. [!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'.