0

我的文件系统上有以下目录结构:

/home/myUser/
    stuff_home/
        fizz/
            a.txt
            b.txt
        buzz/
            1.pdf
        widgets/
            c.txt
            2.pdf
            3.pdf
            4.pdf

我想stuff_home/递归遍历并计算它包含的子目录、.txt文件和.pdf文档的数量。我写了一个小的 Python 脚本:

import os

dirCnt = 0
txtCnt = 0
pdfCnt = 0

def main():
    get_counts("/home/myUser/stuff_home")

    t = str(txtCnt)
    p = str(pdfCnt)
    d = str(dirCnt)
    print "\nRESULTS\Text Files:\t" + t + "\nPDF Files:\t" + p + "\nDirectories:\t" + d + "\n\n"

def get_counts(root):
    contents = os.listdir(root)

    for file in contents:
        if os.path.isdir(file):
            dirCnt = dirCnt + 1
        elif os.path.splitext(file)[1] == "txt":
            txtCnt = txtCnt + 1
        elif os.path.splitext(file)[1] == "pdf":
            pdfCnt = pdfCnt + 1
        else:
            print "Encountered unknown file: " + file

当我运行它时,我没有收到任何错误,但脚本显然编码错误。这是我得到的输出:

Encountered unkown file: fizz
Encountered unkown file: buzz
Encountered unkown file: widgets

RESULTS
Text Files:    0
PDF Files:     0
Directories:   0

有什么让你们 Pythonians 跳出来的吗?看起来我的任何逻辑(用于检测文件与目录,以及splitext用于获取文件扩展名)都在这里工作......提前致谢!

4

1 回答 1

1

这似乎是一份工作os.walk(如果我理解正确的话):

def count_pdf_txt(top):
    npdf = 0
    ntxt = 0
    ndir = 0
    for root,dirs,files in os.walk(top):
        ndir += len(dirs)
        for f in files:
            if f.endswith('txt'): #use `splitext` if you like.
                ntxt += 1
            elif f.endswith('pdf'):
                npdf += 1
            else:
                print "unknown"

    return npdf,ntxt,ndirs

请注意,由于以下行,您的版本会给出错误的结果:

 pdfCount = pdfCount + 1

在你的get_counts函数里面。这会创建一个新的局部变量,它不会以任何方式影响全局变量。为了让你的局部变量改变全局变量,你需要将它们声明为global. 例如global pdfCount。但是,global函数中关键字的出现应该总是让你认为“必须有更好的方法来做到这一点”

于 2012-09-13T13:54:05.767 回答