0

私のファイルシステムには次のディレクトリ構造があります。

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

再帰的にトラバースし、そこに含まれるサブディレクトリ、ファイル、およびドキュメントstuff_home/の数を数えたいと思います。小さな Python スクリプトを作成しました。.txt.pdf

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関数内。これにより、グローバル変数にまったく影響を与えない新しいローカル変数が作成されます。ローカル変数でグローバル変数を変更するには、それらを として宣言する必要があります。例えば。ただし、関数にキーワードが存在すると、常に「これを行うためのより良い方法が必要だ」と考える必要があります。globalglobal pdfCountglobal

于 2012-09-13T13:54:05.767 に答える