python os.path.isfile函数

  最近刚开始学习Python,做了个小练习:扫描当前目录及其子目录中的文件,找出文件名中含有指定关键字的文件并打印文件名。思路很简单,如果是文件则判断是否满足条件;如果是目录则进入目录搜索文件,递归。

  思路有了那就准备开撸

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 
 4 import os
 5 import sys
 6 
 7 def search(token):
 8     for file in os.listdir('.'):
 9         if os.path.isfile(file):    #如果是文件
10             if token in file:
11                 print file
12         elif os.path.isdir(file):   #如果是目录
13             os.chdir(file)
14             search(token)
15 
16 if __name__ == '__main__':
17     search(sys.argv[1])

撸完测试,发现结果跟想象的不一样,遇到子目录后就退出了,通过调试发现递归函数返回后再次判断file是否为文件时,结果都是否,后来修改了os.path.isfile函数的参数:在for循环前利用os.getcwd函数获取当前路径并保存,再结合os.path.join函数拼接file形成绝对路径,这样修改后,程序运行结果符合预期。

  通过比对分析,问题应该出在os.path.isfile函数处,官方文档上对该函数的说明也比较简略:

os.path.isfile(path)
Return True if path is an existing regular file. This follows symbolic links, so both islink() and isfile() can be true for the same path.

既然对于绝对路径的判断该函数返回结果没问题,而代码中传入的参数是相对(当前)路径的,那说明os.path.isfile函数在处理相对路径的文件时,默认是当前工作目录,恰好代码中再递归调用search函数时修改了当前工作目录,这就导致递归返回后os.path.isfile函数判断结果与预期不符,修改后代码如下:

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 
 4 import os
 5 import sys
 6 
 7 def search(token):
 8     pwd = os.getcwd()
 9     for file in os.listdir('.'):
10         if os.path.isfile(file):    #如果是文件
11             if token in file:
12                 print file
13         elif os.path.isdir(file):   #如果是目录
14             os.chdir(file)
15             search(token)
16             os.chdir(pwd)
17 
18 if __name__ == '__main__':
19     search(sys.argv[1])

结论

  在调用os.path.isfile函数判断是否为普通文件时,若传入的路径是相对路径,则默认是在当前工作目录下搜索该文件。

猜你喜欢

转载自www.cnblogs.com/April01xxx/p/9202355.html