[英]Recursively listing all files in Python, not able to fetch all
我想遞歸地列出從當前目錄開始的所有文件。 我的目錄結構:
│ 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。 我還嘗試將條目更改為包括絕對路徑,但仍然失敗。
使用當前代碼並進行盡可能少的修改:
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())
如您所見,沿着文件路徑跟蹤文件時,需要完整路徑。
當您這樣做時:
elif os.path.isdir(entry):
list_content_recursively(entry)
entry
只是目錄名,而不是完整路徑。 遞歸調用函數時,還需要包含start_point
。
elif os.path.isdir(entry):
list_content_recursively(os.path.join(start_point, entry))
同樣適用於:
if os.path.isfile(entry):
...
elif os.path.isdir(entry):
...
該entry
也應該是完整路徑,您應該使用os.path.join(start_point, entry)
替換entry
。
您的修改版本,使用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
給定目錄和子目錄遞歸返回一個元組:
因此:
def list_content(cwd, directories, files):
print("Call from: " + cwd)
for directory in directories:
print("Directory:" + directory)
for file in files:
print("File: " + file)
print()
for subdir in os.walk(os.getcwd()):
list_content(*subdir)
編輯:我發布后看到您想要重新實現步行,所以這里的一些幫助是另一種方法:
import os
def list_content_recursively():
cwd = os.getcwd()
print("Call from: " + cwd)
for entry in os.listdir(cwd):
if os.path.isfile(entry):
print("File: " + entry)
elif os.path.isdir(entry):
os.chdir(entry)
list_content_recursively()
os.chdir("..")
如果要從任意位置開始,也可以將其包裝在執行os.chdir
的函數中,否則abccd的答案仍然有效:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.