我正在尝试编写一个带有输入目录的python程序,并打印出目录中的所有.txt文件。但是,如果该文件夹中有另一个文件夹,它必须使用递归执行相同的操作。
我的问题是只有.txt文件,并且不会进一步遍历目录。
import os
path = input("What directory would you like to search?: ")
def traverse(path):
files = os.listdir(path)
for i in files:
if os.path.isdir(i) == True:
traverse(i)
elif i.endswith('.txt'):
print(i)
traverse(path)
有什么问题?
答案 0 :(得分:2)
看起来你的代码失败的原因是因为if os.path.isdir(i) == True
行总是失败,无论文件是否是目录。这是因为files
变量存储相对路径而不是绝对路径,这会导致检查失败。
如果你想使用你提供的递归方法来做,你的代码可以改变如下:
import os
path = input("What directory would you like to search?: ")
def traverse(path):
files = os.listdir(path)
files = (os.path.join(os.path.abspath(path), file) for file in files)
for i in files:
if os.path.isdir(i) == True:
traverse(i)
elif i.endswith('.txt'):
print(i)
traverse(path)
这是使用fnmatch更好的方法(适用于Use a Glob() to find files recursively in Python?中的其余代码)。它将递归搜索提供的目录中的所有文件,并将那些以
结尾的文件进行匹配import fnmatch
import os
path = input("What directory would you like to search?: ")
def traverse(path):
matches = []
for root, dirnames, filenames in os.walk(path):
for filename in fnmatch.filter(filenames, '*.txt'):
matches.append(os.path.join(root, filename))
print matches
traverse(path)
答案 1 :(得分:1)
你错过了完整的路径,否则它很好。见下文
def traverse(path):
files = os.listdir(path)
for i in files:
if os.path.isdir(os.path.join(path,i)):
traverse(os.path.join(path,i))
elif i.endswith('.txt'):
print(os.path.join(path,i))