kidys 发表于 2015-4-26 08:47:43

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

  在提交版本库的时候需要清除工作目录下的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

>>>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, '')
[]
>>> fnmatch.filter(files, '*')
['tags', 'test.py']
>>> fnmatch.filter(files, '*')
['tags', 'readme.txt', 'test.py']
>>> fnmatch.filter(files, '**')
['tags', 'readme.txt', 'test.py']
>>> fnmatch.filter(files, '?*')
['tags']  注意: 匹配单个seq中的任意单个字符

[*]fnmatch.translate(pattern):翻译模式, fnmatch将这种全局模式转换成一个正则式, 然后使用re模块来比较名字和模式。 translate() 函数是一个公共API用于将全局模式转换成正则式。


>>>import fnmatch
>>> pattern='*.py'
>>>print fnmatch.translate(pattern)
.*\.py\Z(?ms)

[*]unix shell风格匹配方式

[*]*表示匹配任何单个或多个字符
[*]?表示匹配单个字符
[*] 匹配单个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'.
  
页: [1]
查看完整版本: python目录遍历和删除指定目录下的pyc文件