python os.path.isfile函数

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

  思路有了那就准备开撸

 #!/usr/bin/env python
# -*- coding: utf-8 -*- import os
import sys def search(token):
for file in os.listdir('.'):
if os.path.isfile(file): #如果是文件
if token in file:
print file
elif os.path.isdir(file): #如果是目录
os.chdir(file)
search(token) if __name__ == '__main__':
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函数判断结果与预期不符,修改后代码如下:

 #!/usr/bin/env python
# -*- coding: utf-8 -*- import os
import sys def search(token):
pwd = os.getcwd()
for file in os.listdir('.'):
if os.path.isfile(file): #如果是文件
if token in file:
print file
elif os.path.isdir(file): #如果是目录
os.chdir(file)
search(token)
os.chdir(pwd)

if __name__ == '__main__':
search(sys.argv[1])

结论

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

上一篇:java 检查抛出的异常是否是要捕获的检查性异常或运行时异常或错误


下一篇:外部无法捕捉Realm的doGetAuthenticationInfo方法抛出的异常