如何使用Python获取一个文件夹中所有文件的递归列表?我知道可以使用os.walk()
,但它似乎过于复杂只是为了获取未经筛选的所有文件列表。难道这是唯一的选择吗?
如何使用Python获取一个文件夹中所有文件的递归列表?我知道可以使用os.walk()
,但它似乎过于复杂只是为了获取未经筛选的所有文件列表。难道这是唯一的选择吗?
没有任何阻止你创建自己的函数:
import os
def listfiles(folder):
for root, folders, files in os.walk(folder):
for filename in folders + files:
yield os.path.join(root, filename)
你可以这样使用它:
for filename in listfiles('/etc/'):
print filename
find .
也会列出目录。不过修复非常容易。 :) - Lauritz V. Thaulowos.walk()
绝不是过度使用。它可以在一瞬间生成您的文件和目录列表:
files = [os.path.join(dirpath, filename)
for (dirpath, dirs, files) in os.walk('.')
for filename in (dirs + files)]
你可以将它转换为生成器,以便一次只处理一个路径并节省内存。你还可以使用Python中的find
程序本身,通过使用sh来实现。
import sh
text_files = sh.find(".", "-iname", "*.txt")
sh
不是内置命令。我以为它是因为听起来很熟悉。 - Noumenonpathlib.Path.rglob
很简单。它列出了整个目录树。
(参数是文件路径的搜索模式。"*"
意味着列出所有内容)
import pathlib
for path in pathlib.Path("directory_to_list/").rglob("*"):
print(path)
os.walk()难以使用,建议放弃并使用pathlib代替。
这里有一个Python函数,类似于R语言中的list.files函数。
def list_files(path,pattern,full_names=False,recursive=True):
if(recursive):
files=pathlib.Path(path).rglob(pattern)
else:
files=pathlib.Path(path).glob(pattern)
if full_names:
files=[str(f) for f in files]
else:
files=[f.name for f in files]
return(files)
import os
path = "path/to/your/dir"
for (path, dirs, files) in os.walk(path):
print files
这是过度设计了吗,还是我漏掉了什么?
isdir()
/ isfile()
和 listdir()
进行手动递归,要么使用 subprocess.check_output()
并调用 find .
。基本上,os.walk()
是最高级别的,稍微低一级的是基于 listdir()
的半手动解决方案,如果你想要与 find .
相同的输出,出于某种原因,你可以使用 subprocess
进行系统调用。