没有os.walk的Python递归目录读取

时间:2014-05-05 08:41:49

标签: python python-2.7 recursion

我试图通过在Python中定义递归函数(而不是使用os.walk)来遍历目录树并在输出文本文件中搜索数据。

import os

def walkfn(dirname):
    if os.path.exists('output'):
        file1 = open('output')
        for line in file1:
            if line.startswith('Final value:'):
                print line
    else:
        for name in os.listdir(dirname):
            path = os.path.join(dirname, name)
            if os.path.isdir(path):
                print "'", name, "'"
                newdir = os.chdir(path)
                walkfn(newdir)

cwd = os.getcwd()
walkfn(cwd)

我收到以下错误:

Traceback (most recent call last):
  File "/home/Python Work/Test2.py", line 24, in <module>
    walkfn(cwd)
  File "/home/Python Work/Test2.py", line 19, in walkfn
    walkfn(newdir)
  File "/home/Python Work/Test2.py", line 12, in walkfn
    for name in os.listdir(dirname):
TypeError: coercing to Unicode: need string or buffer, NoneType found

1 个答案:

答案 0 :(得分:0)

os.chdir()返回None,而不是新目录名。您将该结果传递给递归walkfn()函数,然后传递给os.listdir()

无需分配,只需将path传递给walkfn()

for name in os.listdir(dirname):
    path = os.path.join(dirname, name)
    if os.path.isdir(path):
        print "'", name, "'"
        os.chdir(path)
        walkfn(path)

您通常希望避免更改目录;如果您的代码使用绝对路径,则无需使用:

def walkfn(dirname):
    output = os.path.join(dirname, 'output')
    if os.path.exists(output):
        with open(output) as file1:
            for line in file1:
                if line.startswith('Final value:'):
                    print line
    else:
        for name in os.listdir(dirname):
            path = os.path.join(dirname, name)
            if os.path.isdir(path):
                print "'", name, "'"
                walkfn(path)