递归列出Python中的所有文件,无法获取所有文件
我想递归地列出从我当前目录开始的所有文件。 我的目录结构:递归列出Python中的所有文件,无法获取所有文件,python,recursion,Python,Recursion,我想递归地列出从我当前目录开始的所有文件。 我的目录结构: │ cat.py │ cat2.py │ du.py │ README.md.txt │ └───FirstInnerDirectory │ file.txt │ └───SecondInnerDirectory file2.txt 我的剧本: import os def list_content_recursively(start_point): prin
│ cat.py
│ cat2.py
│ du.py
│ README.md.txt
│
└───FirstInnerDirectory
│ file.txt
│
└───SecondInnerDirectory
file2.txt
我的剧本:
import os
def list_content_recursively(start_point):
print("Call from: " + start_point)
for entry in os.listdir(start_point):
if os.path.isfile(entry):
print("File: " + entry)
elif os.path.isdir(entry):
list_content_recursively(entry)
list_content_recursively(os.getcwd())
我的输出:
Call from: C:\Users\Username\Desktop\Programming\week02\03.Files
File: cat.py
File: cat2.py
File: du.py
Call from: FirstInnerDirectory
File: README.md.txt
我不知道为什么它不返回FirstInnerDirectory中的文件,并且它不将SecondInnerDirectory识别为dir obj。我还试图将条目更改为包含绝对路径,但仍然失败。如果您这样做:
elif os.path.isdir(entry):
list_content_recursively(entry)
entry
只是目录名,而不是完整路径。在递归调用函数时,还需要包含起点
elif os.path.isdir(entry):
list_content_recursively(os.path.join(start_point, entry))
这同样适用于:
if os.path.isfile(entry):
...
elif os.path.isdir(entry):
...
条目
也应该是完整路径,您应该使用os.path.join(起始点,条目)
替换条目
执行以下操作时:
elif os.path.isdir(entry):
list_content_recursively(entry)
entry
只是目录名,而不是完整路径。在递归调用函数时,还需要包含起点
elif os.path.isdir(entry):
list_content_recursively(os.path.join(start_point, entry))
这同样适用于:
if os.path.isfile(entry):
...
elif os.path.isdir(entry):
...
条目
也应该是完整路径,您应该使用os.path.join(起点,条目)
替换条目
我想说的是,问题是您没有输入子目录。您真正想要的是os.walk
,对于给定的目录和子目录,它递归地返回一个元组:
- 当前目录
- 当前目录中的目录
- 当前目录中的文件
def列表内容(cwd、目录、文件):
打印(“来自:+cwd的呼叫”)
对于目录中的目录:
打印(“目录:”+目录)
对于文件中的文件:
打印(“文件:”+文件)
打印()
对于os.walk(os.getcwd())中的子目录:
列表内容(*子目录)
编辑:
我在发布后看到,您希望重新实现walk,因此这里的一些帮助是另一种实现方法:
导入操作系统
def list_content_递归():
cwd=os.getcwd()
打印(“来自:+cwd的呼叫”)
对于os.listdir(cwd)中的条目:
如果os.path.isfile(条目):
打印(“文件:+条目)
elif os.path.isdir(条目):
os.chdir(条目)
递归地列出内容
os.chdir(“…”)
如果你想从一个任意的地方开始,你也可以把它包装在一个函数中,这个函数以前做过一个
os.chdir
,否则abccd的答案仍然有效:)我想说问题是你没有输入子目录。您真正想要的是os.walk
,对于给定的目录和子目录,它递归地返回一个元组:
- 当前目录
- 当前目录中的目录
- 当前目录中的文件
def列表内容(cwd、目录、文件):
打印(“来自:+cwd的呼叫”)
对于目录中的目录:
打印(“目录:”+目录)
对于文件中的文件:
打印(“文件:”+文件)
打印()
对于os.walk(os.getcwd())中的子目录:
列表内容(*子目录)
编辑:
我在发布后看到,您希望重新实现walk,因此这里的一些帮助是另一种实现方法:
导入操作系统
def list_content_递归():
cwd=os.getcwd()
打印(“来自:+cwd的呼叫”)
对于os.listdir(cwd)中的条目:
如果os.path.isfile(条目):
打印(“文件:+条目)
elif os.path.isdir(条目):
os.chdir(条目)
递归地列出内容
os.chdir(“…”)
如果您想从任意位置开始,您也可以将其包装在一个函数中,该函数以前执行过
os.chdir
,否则abccd的答案仍然有效:)使用当前代码并尽可能少地修改:
import os
def list_content_recursively(start_point):
print("Call from: " + start_point)
for entry in os.listdir(start_point):
full_path = os.path.join(start_point, entry)
if os.path.isfile(full_path):
print("File: " + entry)
elif os.path.isdir(full_path):
list_content_recursively(full_path)
list_content_recursively(os.getcwd())
正如您所看到的,当沿着文件路径跟踪文件时,您需要完整的路径。使用当前代码并尽可能少地修改:
import os
def list_content_recursively(start_point):
print("Call from: " + start_point)
for entry in os.listdir(start_point):
full_path = os.path.join(start_point, entry)
if os.path.isfile(full_path):
print("File: " + entry)
elif os.path.isdir(full_path):
list_content_recursively(full_path)
list_content_recursively(os.getcwd())
如您所见,在沿着文件路径跟踪文件时,您需要完整路径。您的修改版本,使用
pathlib
,并将绝对路径传递给isfile
和isdir
import os
import pathlib
def list_content_recursively(start_point):
print("Call from: " + str(start_point))
for entry in os.listdir(start_point):
entry_path = pathlib.Path(start_point) / entry
if os.path.isfile(entry_path):
print("File: " + str(entry))
if os.path.isdir(entry_path):
list_content_recursively(entry_path)
list_content_recursively(pathlib.Path('.'))
您的修改版本,使用
pathlib
,并将绝对路径传递到isfile
和isdir
import os
import pathlib
def list_content_recursively(start_point):
print("Call from: " + str(start_point))
for entry in os.listdir(start_point):
entry_path = pathlib.Path(start_point) / entry
if os.path.isfile(entry_path):
print("File: " + str(entry))
if os.path.isdir(entry_path):
list_content_recursively(entry_path)
list_content_recursively(pathlib.Path('.'))
你是想重新发明
os.walk()
?重新发明不是一个确切的词,我只是想实现它的一部分以便更好地理解。你是想重新发明os.walk()
?重新发明不是一个确切的词,我只是想实现它的一部分以便更好地理解。非常感谢约书亚:)非常感谢约书亚:)