30
42

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Pythonのファイル・フォルダのループ処理

Last updated at Posted at 2020-11-29

globを使えばよいだけなのですが、実用的には絶対パス化、ディレクトリ・ファイルのフィルタリング、ソートも行った方がよいため、コードもいくらか長くなります。

トップディレクトリ以下の全サブディレクトリを処理する

import os
import glob

# トップディレクトリをセットする sys.argv[1]など
top_level_dir_path = '/home/user'
# サブディレクトリ、ファイルの絶対パスのリストを得る
# 再帰処理(サブディレクトリ以下のディレクトリも処理する)したい場合は recursive=True にする
# recursive=False の場合はワイルドカードは '/*' でよいが recursive=Trueの場合は '/**' とする
# Windows, Linuxどちらもパスの区切り文字は/でOK
paths = map(os.path.abspath, glob.glob(top_level_dir_path + '/**', recursive=False))
# ディレクトリのみフィルタリングする
paths = filter(os.path.isdir, paths)
# ソートされていないので昇順にソートする
paths = sorted(paths)
# 1つずつ処理する
for i, p in enumerate(paths):
    print('[%s / %s] Start processing %s' % (i + 1, len(paths), p))

トップディレクトリ以下のファイル名パターンにマッチしたファイルを処理する

import os
import glob

# トップディレクトリをセットする sys.argv[1]など
top_level_dir_path = '/home/user'
# サブディレクトリ、ファイルの絶対パスのリストを得る
# この例ではjpgファイルを取得している
# ファイル名に特定の文字列が含まれる場合は *tokutei*.jpg とする
# /**はrecurseive=Trueと合わせて再帰的にディレクトリを全列挙するという意味
paths = map(os.path.abspath, glob.glob(top_level_dir_path + '/**/*.jpg', recursive=True))
# ファイルのみフィルタリングする
paths = filter(os.path.isfile, paths)
# ソートされていないので昇順にソートする
paths = sorted(paths)
# 1つずつ処理する
for i, p in enumerate(paths):
    print('[%s / %s] Start processing %s' % (i + 1, len(paths), p))

参考

ファイル・ディレクトリの名前のパターンマッチングについては公式ドキュメントを参照してください。

30
42
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
42

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?