如何在Python中查找目录及其子目录下的所有文件?
有没有什么内置的函数可以找到某个特定文件夹下的所有文件,包括子文件夹里的文件?我试过这个代码,但不太管用……可能是逻辑本身就有问题……
def fun(mydir):
lis=glob.glob(mydir)
length=len(lis)
l,i=0,0
if len(lis):
while(l+i<length):
if os.path.isfile(lis[i]):
final.append(lis[i])
lis.pop(i)
l=l+1
i=i+1
else:
i=i+1
print final
fun(lis)
else:
print final
3 个回答
3
我非常推荐这个路径模块,是Jason Orendorff写的:
http://pypi.python.org/pypi/path.py/2.2
可惜他的网站现在无法访问,不过你仍然可以通过上面的链接下载(或者如果你喜欢的话,也可以用easy_install
来安装)。
使用这个路径模块,你可以对路径进行各种操作,包括你请求的遍历文件。这里有个例子:
from path import path
my_path = path('.')
for file in my_path.walkfiles():
print file
for file in my_path.walkfiles('*.pdf'):
print file
这个模块还有很多方便的函数,可以用来处理路径的其他事情:
In [1]: from path import path
In [2]: my_dir = path('my_dir')
In [3]: my_file = path('readme.txt')
In [5]: print my_dir / my_file
my_dir/readme.txt
In [6]: joined_path = my_dir / my_file
In [7]: print joined_path
my_dir/readme.txt
In [8]: print joined_path.parent
my_dir
In [9]: print joined_path.name
readme.txt
In [10]: print joined_path.namebase
readme
In [11]: print joined_path.ext
.txt
In [12]: joined_path.copy('some_output_path.txt')
In [13]: print path('some_output_path.txt').isfile()
True
In [14]: print path('some_output_path.txt').isdir()
False
当然,还有更多的操作可以进行,但这些是我最常用的一些。注意,path
类是从string
类继承来的,所以在需要string
的地方也可以使用path
。另外,注意两个或多个path
对象可以很容易地通过重载的/
运算符连接在一起。
希望这对你有帮助!
14
没有现成的函数可以直接使用,不过通过os.walk
这个工具,我们可以很简单地自己写一个:
import os
def recursive_file_gen(mydir):
for root, dirs, files in os.walk(mydir):
for file in files:
yield os.path.join(root, file)
补充说明: os.walk
这个函数可以递归地遍历文件夹里的所有内容;而recursive_file_gen
这个函数是一个生成器(它使用yield
关键字来逐个产生文件)。如果你想得到结果列表,可以这样做:
list(recursive_file_gen(mydir))