201

メインフォルダー内のサブフォルダーを再帰的に通過し、特定のファイルタイプからリストを作成するスクリプトに取り組んでいます。スクリプトに問題があります。現在、次のように設定されています。

for root, subFolder, files in os.walk(PATH):
    for item in files:
        if item.endswith(".txt") :
            fileNamePath = str(os.path.join(root,subFolder,item))

問題はsubFolder、ITEM ファイルが配置されているフォルダーではなく、変数がサブフォルダーのリストを取得していることです。前にサブフォルダーの for ループを実行してパスの最初の部分に参加することを考えていましたが、その前に誰か提案があるかどうかを再確認することにしました。

4

13 に答える 13

247

dirpathあなたが呼び出すを使用する必要がありますroot。が提供されているため、再帰しdirnamesたくないフォルダーがある場合は、プルーニングできます。os.walk

import os
result = [os.path.join(dp, f) for dp, dn, filenames in os.walk(PATH) for f in filenames if os.path.splitext(f)[1] == '.txt']

編集:

最新の反対票の後、glob拡張子で選択するためのより良いツールであることに気づきました。

import os
from glob import glob
result = [y for x in os.walk(PATH) for y in glob(os.path.join(x[0], '*.txt'))]

ジェネレーター版も

from itertools import chain
result = (chain.from_iterable(glob(os.path.join(x[0], '*.txt')) for x in os.walk('.')))

Edit2 for Python 3.4+

from pathlib import Path
result = list(Path(".").rglob("*.[tT][xX][tT]"))
于 2013-08-23T03:24:48.983 に答える
183

Python 3.5で変更: 「**」を使用した再帰的なグロブのサポート。

glob.glob()新しい再帰パラメータを取得しました。

.txtすべてのファイルを取得したい場合my_path(再帰的にサブディレクトリを含む):

import glob

files = glob.glob(my_path + '/**/*.txt', recursive=True)

# my_path/     the dir
# **/       every file and dir under my_path
# *.txt     every file that ends with '.txt'

イテレータが必要な場合は、代わりにiglobを使用できます。

for file in glob.iglob(my_path, recursive=True):
    # ...
于 2016-11-23T04:00:47.983 に答える
16

新しいpathlibライブラリは、これを 1 行に単純化します。

from pathlib import Path
result = list(Path(PATH).glob('**/*.txt'))

ジェネレーター バージョンを使用することもできます。

from pathlib import Path
for file in Path(PATH).glob('**/*.txt'):
    pass

これはオブジェクトを返します。これはPath、ほとんど何にでも使用できます。また、 によってファイル名を文字列として取得できますfile.name

于 2018-05-22T19:03:47.123 に答える
4

再帰は Python 3.5 で新しく追加されたため、Python 2.7 では機能しません。これは文字列を使用する例であるrため、Win、Lin、...のいずれかでパスをそのまま提供するだけで済みます。

import glob

mypath=r"C:\Users\dj\Desktop\nba"

files = glob.glob(mypath + r'\**\*.py', recursive=True)
# print(files) # as list
for f in files:
    print(f) # nice looking single line per file

注: どんなに深くても、すべてのファイルが一覧表示されます。

于 2019-05-30T16:09:38.537 に答える