2

だから、これが私の小さなプログラムです。特定のディレクトリ内のすべてのファイルとすべてのサブディレクトリ内のすべてのファイルを出力する必要があります。

import os

def listFiles(directory):
    dirList = os.listdir(directory)
    printList = []
    for i in dirList:
        i = os.path.join(directory,i)
      #  print(i)
        if os.path.isdir(i):
            printList[len(dirList):] = listFiles(i)
        else:
            printList.append(i)
    return printList

directory = 'C:\Python32\Lib'
listFiles(directory)
a = listFiles(directory)

for i in a:
    print(i)

問題は何ですか:os.path.isdir(i)が正しく機能していません-たとえば、私が試した場合

os.path.isfile('C:\Python32\Lib\concurrent\futures\process.py')
os.path.exists('C:\Python32\Lib\concurrent\futures\process.py')
os.path.isdir('C:\Python32\Lib\concurrent\futures')

私は常にTrueではなくFalseを取得します(一部のサブディレクトリでは問題なく機能します)。print(i)のコメントを外すと、すべてが正常に印刷されますが、ディレクトリも印刷されます。ファイルだけを印刷したいのです。私は何をすべきか?

4

1 に答える 1

2

ループprintList[len(dirList):] = listFiles(i)ごとに値を上書きします。

たとえば、すべてのエントリdirListがディレクトリの場合、printList各サブディレクトリをループすると、エントリが削除されます。

>>> printList = []
>>> len_dirlist = 2  # make up a size
>>> printList[len_dirlist:] = ['foo', 'bar', 'baz'] # subdir 1 read
>>> printList
['foo', 'bar', 'baz']
>>> printList[len_dirlist:] = ['spam', 'ham', 'eggs'] # subdir 2 read
>>> printList
['foo', 'bar', 'spam', 'ham', 'eggs']  # Wait, where did 'baz' go?

.extend()リストの最後にアイテムを追加するときに代わりに使用します。

Windows では、バックスラッシュをパスの区切り記号として使用する必要はありません。スラッシュは Python 文字列では特別な意味を持たないため、スラッシュを使用することをお勧めします。

'C:/Python32/Lib/concurrent/futures/process.py'

r'' または、生の文字列リテラルを使用して、バックスラッシュが文字エスケープとして解釈される可能性を取り除きます。

r'C:\Python32\Lib\concurrent\futures\process.py'
于 2012-09-22T20:38:10.920 に答える