1

私はこのディレクトリ構造を持っています:

test1
   file1.txt
   test2
       file2.txt
       test3
           file3.txt
           test4
                file4.txt

このディレクトリレベルを印刷する現在のコードは次のとおりです。

    import os
    def printRootStructure(dirname,indent=0):
        for i in range(indent):
            print "   ",
        print dirname
        if os.path.isdir(dirname):
            for files in os.listdir(dirname):
                printRootStructure(files,indent+1)


    printRootStructure("test")

現在、次のように印刷されます

test
    file1.txt
    test1

次のレベルに進んでいません。ここでトラブルシューティングに役立ちますか?

4

2 に答える 2

3

再帰を使用する特別な理由がない限り、os.walkを使用してディレクトリ構造をトラバースする方が簡単です。

import os
import os.path as P
for topdir, subdirs, files in os.walk(starting_point):
  print "    " * topdir.count(P.sep), P.basename(topdir)
  for f in sorted(files):
    print "    " * (topdir.count(P.sep) + 1), f
于 2013-11-06T05:45:32.233 に答える
2

フルパス名をに渡すことでこれを修正できると思いますprintRootStructure

import os
def printRootStructure(dirname,indent=0):
    for i in range(indent):
        print "   ",
    print os.path.basename(dirname) # changed
    if os.path.isdir(dirname):
        for files in os.listdir(dirname):
            printRootStructure(os.path.join(dirname,files),indent+1) # changed

printRootStructure元のコードと同様に、再帰呼び出しを行ったときに、各ファイルの最後の部分 (これは「ベース名」と呼ばれます) だけを渡していました。

作業ディレクトリとパス名

最新のコンピューターでプログラムを起動するときはいつでも、プログラムはファイルシステムの固定された場所で実行されます (これは「現在の作業ディレクトリ」と呼ばれます)。コマンドラインからプログラムを起動する場合、現在の作業ディレクトリは単にプログラムの名前を起動したパスです。GUI 環境で何かをクリックしてプログラムを呼び出すと、より複雑になる可能性がありますが、一般的な動作は同じです。プログラムは常に特定の作業ディレクトリで実行されます。

すべてのパス テスト、特にos.path.isdirは、その作業ディレクトリに関して評価されます。したがって、例で最初の再帰呼び出しを行うときはos.path.isdir("test1")、作業ディレクトリには存在しないテスト中です-「test」内にのみ存在します!

修正は、完全なパス名を再帰呼び出しに渡すことです。次に、ツリーを出力するとフル ネームが過剰になる可能性があるため、os.path.basename各ファイルのベース名部分だけを出力する呼び出しを追加しました。

于 2013-11-06T05:28:14.230 に答える