我正在尝试对给定路径下的所有文件执行操作。我不想事先收集所有的文件名,然后对它们做些什么,所以我尝试了这样做:
import os
import stat
def explore(p):
s = ''
list = os.listdir(p)
for a in list:
path = p + '/' + a
stat_info = os.lstat(path )
if stat.S_ISDIR(stat_info.st_mode):
explore(path)
else:
yield path
if __name__ == "__main__":
for x in explore('.'):
print '-->', x
但这段代码在目录被命中时会跳过目录,而不是生成目录的内容。我做错什么了?
使用^{} 而不是重新设计轮子。
特别是,遵循库文档中的示例,下面是一个未经测试的尝试:
问题是这行代码:
它是做什么的?
path
调用explore
explore
运行,创建生成器explore(path)
的位置。为什么要丢弃?它没有被分配给任何东西,也没有被迭代——它被完全忽略了。
如果你想对结果做点什么,那么,你必须对结果做点什么!;)
修复代码的最简单方法是:
当您确信您了解正在发生的事情时,您可能需要使用
os.walk()
。一旦您迁移到Python 3.3(假设所有工作都按计划进行),您将能够使用新的
yield from
语法,此时修复代码的最简单方法是:迭代器不能像那样递归地工作。你必须通过替换
有点像
Python 3.3添加了PEP 380中建议的语法
yield from X
,以达到此目的。你可以用它来代替:如果使用generators as coroutines,则此语法还支持使用^{} 将值传递回递归调用的生成器。上面的简单
for
循环不会。相关问题 更多 >
编程相关推荐