84

pathlibライブラリを使用して、特定のディレクトリの下にあるすべてのファイルのリストを作成する関数を作成するのを手伝ってくれる人はいますか?

ここに、次のものがあります。

ここに画像の説明を入力

私は持っている

  • c:\desktop\test\A\A.txt

  • c:\desktop\test\B\B_1\B.txt

  • c:\desktop\test\123.txt

上記のパスを持つ単一のリストがあることを期待していましたが、私のコードはネストされたリストを返します。

これが私のコードです:

from pathlib import Path

def searching_all_files(directory: Path):   
    file_list = [] # A list for storing files existing in directories

    for x in directory.iterdir():
        if x.is_file():

           file_list.append(x)
        else:

           file_list.append(searching_all_files(directory/x))

    return file_list


p = Path('C:\\Users\\akrio\\Desktop\\Test')

print(searching_all_files(p))

誰かが私を修正してくれることを願っています。

4

10 に答える 10

8

ファイルオブジェクトのみが.名前に含まれていると仮定できる場合 (つまり、.txt、.png など)、グロブ検索または再帰的グロブ検索を行うことができます...

from pathlib import Path

# Search the directory
list(Path('testDir').glob('*.*'))

# Search directories and subdirectories, recursively
list(Path('testDir').rglob('*.*'))

しかし、常にそうであるとは限りません。.ipynb_checkpoints拡張子のない や ファイルなどの隠しディレクトリが存在する場合があります。その場合は、リスト内包表記またはフィルターを使用して、ファイルである Path オブジェクトを並べ替えます。

# Search Single Directory
list(filter(lambda x: x.is_file(), Path('testDir').iterdir()))

# Search Directories Recursively
list(filter(lambda x: x.is_file(), Path('testDir').rglob('*')))
# Search Single Directory
[x for x in Path('testDir').iterdir() if x.is_file()]

# Search Directories Recursively
[x for x in Path('testDir').rglob('*') if x.is_file()]
于 2020-07-17T17:06:21.993 に答える
4

pathlib2 を使用する方がはるかに簡単です。

from pathlib2 import Path

path = Path("/test/test/")
for x in path.iterdir():
    print (x)
于 2019-11-12T19:52:08.227 に答える
2
def searching_all_files(directory: Path):   
    file_list = [] # A list for storing files existing in directories

    for x in directory.iterdir():
        if x.is_file():
            file_list.append(x)#here should be appended
        else:
            file_list.extend(searching_all_files(directory/x))# need to be extended

    return file_list
于 2016-10-07T05:06:20.020 に答える
0

os.listdir() を使用できます。ディレクトリ内のすべてのもの(ファイルとディレクトリ)を取得します。

ファイルだけが必要な場合は、os.path を使用してこれをフィルタリングできます。

from os import listdir
from os.path import isfile, join
onlyfiles = [files for files in listdir(mypath) if isfile(join(mypath, files))]

または、アクセスするディレクトリごとに 2 つのリストを生成する os.walk() を使用することもできます - ファイルとディレクトリに分割されます。トップディレクトリのみが必要な場合は、最初に生成されたときにブレークできます

from os import walk
files = []
for (dirpath, dirnames, filenames) in walk(mypath):
    files.extend(filenames)
    break
于 2016-10-07T05:20:05.167 に答える