我正在尝试在python中编写一个函数来扫描脚本级别的目录内容(一旦被删除,我将把它切换到不需要处于同一级别但是对于这个问题它是无关紧要的)并且递归地列出不是目录的任何路径。我正在使用的逻辑是:
如果父“目录”不是目录,则它必须是文件,因此请打印它的路径。否则,对于该目录中的每个“文件”,如果每个“文件”实际上不是一个目录,则说明该文件的路径,如果“文件”实际上是一个目录,则再次调用该函数。
我正在使用的环境如下:我的脚本与名为a的目录处于同一级别,并且a内部是文件d.txt,以及另一个名为b的目录。里面的b是文件c.text。按照我希望这个函数执行的方式,首先它应该认识到a实际上是一个目录,因此开始迭代它的内容。当它遇到d.txt时,它应该打印出它的路径,然后当它遇到目录b时,它应该开始迭代它的内容,从而在它看到它时打印到c.txt的路径。所以在这个例子中,脚本的输出应该是“C:\ private \ a \ d.txt,C:\ private \ a \ b \ c.txt”,而是“C:\ private \ d.txt” ,C:\ private \ b“。这是迄今为止的代码:
import os
def find_root(directory):
if not os.path.isdir(directory):
print(os.path.abspath(directory))
else:
for file in os.listdir(directory):
if not os.path.isdir(file):
print(os.path.abspath(file))
else:
find_root(file)
find_root('a')
答案 0 :(得分:2)
[Python]: os.listdir(path='.'):
返回一个列表,其中包含 path 指定的目录中的条目名称。
但它们只是基本名称。所以,为了使它们有意义,当你在递归中更深层次时:
cd
到每个文件夹(从递归返回时还是cd
)您的代码已修改为使用1 st 方法:
import os
def find_root(path):
if os.path.isdir(path):
for item in os.listdir(path):
full_item = os.path.join(path, item)
if os.path.isdir(full_item):
find_root(full_item)
else:
print(os.path.abspath(full_item))
else:
print(os.path.abspath(path))
if __name__ == "__main__":
find_root("a")
备注强>:
<强>输出强>:
c:\Work\Dev\StackOverflow\q47193260>"c:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" a.py c:\Work\Dev\StackOverflow\q47193260\a\b\c.txt c:\Work\Dev\StackOverflow\q47193260\a\d.txt