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

发布时间:2020-02-24编辑:脚本学堂
本文介绍下,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,其中第一个为起始路径,第二个为起始路径下的文件夹,第三个是起始路径下的文件。
举例:
 

复制代码 代码示例:
<span style="font-size:12px;font-weight: normal;">>>> 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()中所有的参数将被统一格式为所有大写或所有小写。
 

复制代码 代码示例:
>>> 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 ( names, pattern): 与平台无关的大小写敏感的fnmatch.fnmatch
fnmatch.filter( names, pattern):实现列表特殊字符的过滤或筛选,返回符合匹配模式的字符列表,例:

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

复制代码 代码示例:
>>>import fnmatch 
>>> pattern='*.py' 
>>>print fnmatch.translate(pattern) 
.*.pyZ(?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'。