遍历目录

时间:2016-04-05 01:10:50

标签: python python-2.7 python-3.x module

我正在尝试编写一个带有输入目录的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)

有什么问题?

2 个答案:

答案 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))