# -*- coding:utf-8  -*-
import os
import time
file_list = []
def findFile(path):
listFile = os.listdir(path)
for file in listFile:
try:
file =os.path.join(path,file)
if os.path.isfile(file):
yield file # test1
#file_list.append(file) # test2
#print(file.decode('gb2312'))
else:
findFile(file)
except WindowsError,e:
# 捕获系统不允许访问的文件夹导致的异常,会让程序无法进行下去
# 将不允许访问的文件夹,直接跳过该文件夹
print(e)
continue
except Exception,e:
print(e)

测试代码:

start = time.time()
print('start time : ' + str(start))
t = findFile('H:\\python')
for i in t:
try:
print(str(i).decode('gb2312'))
except UnicodeDecodeError:
pass
print('use time : ' + str(time.time() - start))

然后运行就会只是将输入路径下的所有文件列举出来而已,但是没有将其下的目录下的文件列举出来,如图:

但是在上述代码中,修改一下代码,将yield file这一句注释,改用下面那一句后,即使用一个列表将所有结果汇集在一起后,然后测试,测试代码如下:

start = time.time()
print('start time : ' + str(start))
findFile('H:\\python')
for i in file_list:
try:
print(str(i).decode('gb2312'))
except UnicodeDecodeError:
pass
print('use time : ' + str(time.time() - start))

这次测试是可以正常显示所有文件夹下的所有文件的,如图:

这证明不是函数编写出现的问题,也不是出现异常导致不能获取到其他文件夹下的文件,也将测试的代码放出吧,其实只是就是在函数体加异常,而且将异常显示出来,

但是发现执行期间没有异常产生,如图:

还以为是函数没有回调导致没有查找其他文件夹下的文件,但是使用软件的调试功能来调试该程序,发现并不是函数没有回调,而是listFile始终都是没有改变,

都是H:\python下的所有文件夹和文件的集合,每当判断到其他文件时这个值都不会改变,导致for循环不能判断来自新文件夹下的所有文件夹或文件,

那就是说for循环始终判断H:\python文件夹下的元素,仅此而已。如在调试时,跳到这个NoteFiles目录时,然后就按下一步,一直到for循环时:

再按下一步:

这时发现,它直接进入了下一个文件夹,而不是进入该目录下,也可以发现listFile还是没有改变,为了证明其是进入了H:\python文件夹下的下一个文件夹,可以展开listFile就可以看到for循环直接是忽略了当前文件夹,并且进入了下个文件夹,如图:

但是如果该文件夹没有文件,也可能将会忽略该文件夹,打开NotesFile文件夹,如图:

所以并不是该文件夹下没有文件,所以是因为yield导致的原因。其实经过上述的已经可以判断是yield带来的效果,但是至于为什么会这样,恐怕我不能回答大家,

因为我也不知道,哈哈哈哈哈,至于为社么发这个博客,我只是觉得这个很有探究的意义,但是我不知道是否有意义,因为本人才疏学浅,对python更是刚接触不久,

但是我希望各位前辈可以指点一下,告诉我是不是不能在递归函数使用,还是要修改一下代码才可以使用,希望不吝指教,谢谢。2016-04-04

最新文章

  1. Java并发集合的实现原理
  2. php时间设置为本地
  3. javascript中关于深复制与浅复制的问题
  4. Java中的异常处理:何时抛出异常,何时捕获异常?
  5. psql-07表:分区表
  6. mac 文本编辑器 文本编码Unicode utf-8 不适用的问题
  7. elasticsearch-cn-out-of-box
  8. 通过Maven搭建Mybatis项目
  9. c#类库中使用Session
  10. Eclipse中如何恢复已删除文件
  11. 数字转化为人民币大写(PHP)
  12. 利用WCF与Android实现图片上传并传参
  13. [UIKit学习]06.懒加载,模型,自定义代码段,重写构造方法
  14. 【Netty源码分析】ChannelPipeline(二)
  15. undo系统参数详解
  16. python进程池
  17. 浅尝flutter中的http请求
  18. [Spark Core] Spark 核心组件
  19. 07 Maven 使用Nexus创建私服
  20. SVN 基本的工作循环

热门文章

  1. 08JS高级 ——“继承”
  2. 使用 Oracle Sql plus的一点经验
  3. iOS集成支付宝
  4. excel文件后台代码
  5. Hive进阶(下)
  6. AutoCompleteTextView 和 TextWatcher 详解
  7. Javascript 拖拽雏形——逐行分析代码,让你轻松了解拖拽的原理
  8. XML_PULL解析
  9. cordova开发中遇到的一些坑
  10. python计算md5值