こんにちは、コンポタ課長です。皆さんは、
フォルダの中のファイル名、Pythonでぜんぶ取得したいな~
と思った経験ありませんか?
筆者はこの実装けっこう使うタイミングが多くて、「前も同じコード書いたな…」となることが多かったので、
自分用の備忘録もかねて、「拡張子なしで全件取得」とか「特定の文字を含む奴を抽出」とか色々なパターンでファイル名を取得してみたいと思います。
なおフォルダの構成は、以下のような感じを想定しています。
main.py
folder1
└─ folder2
├─ folder3
│ └─ music.wav
├─ photo1.png
├─ photo2.png
├─ text.txt
└─ text.txt.old
(↑ このファイル名達を取得したい)
ファイル名を取得するソースコードの紹介(8パターン)
ではソースコードを紹介していきます。
フォルダ直下にあるファイル名をすべて取得したい(拡張子あり)
とあるフォルダの直下すべてのファイルの名前を取得します。
その下にさらにフォルダがある場合は、その中身は無視します。(そこも含めて丸ごと取得する方法は後述)
import glob
import os
# 条件に合うファイルパス情報をすべて取得
file_list = glob.glob('folder1/folder2/*.*')
# パス情報からファイル名だけを取り出す
name_list = [os.path.basename(file) for file in file_list]
print(name_list) # ['photo1.png', 'photo2.png', 'text.txt', 'text.txt.old']
ちなみにfor文は「リスト内包記述」で一行にまとめて書いております。
慣れると見た目もスッキリして便利ですよ!興味があったら調べてみて下さい!
フォルダ直下にあるファイル名をすべて取得したい(拡張子なし)
とあるフォルダの直下すべてのファイルの名前を、拡張子なしで取得します。
その下にさらにフォルダがある場合は、その中身は無視します。
import glob
import os
# 条件に合うファイルパス情報をすべて取得
file_list = glob.glob('folder1/folder2/*.*')
# パス情報からファイル名だけを取り出す
name_list = [os.path.splitext(os.path.basename(file))[0] for file in file_list]
print(name_list) # ['photo1', 'photo2', 'text', 'text.txt']
フォルダの中にあるファイル名を丸ごとすべて取得したい(拡張子あり)
とあるフォルダの中にあるすべてのファイルの名前を取得します。
こちらは、フォルダの中にあるフォルダについても中身を無視せずすべて取得してくれます。
import glob
import os
# 条件に合うファイルパス情報をすべて取得
file_list = glob.glob('folder1/folder2/**/*.*', recursive=True)
# パス情報からファイル名だけを取り出す
name_list = [os.path.basename(file) for file in file_list]
print(name_list) # ['photo1.png', 'photo2.png', 'text.txt', 'text.txt.old', 'music.wav']
ちなみにこういった「フォルダの中のフォルダを見に行く」といった処理は「再帰的な処理」(recursive)と表現します。
上のコードでは「recursive=True」としているため、再帰的にフォルダを見てくれるんですね。
フォルダの中にあるファイル名を丸ごとすべて取得したい(拡張子なし)
とあるフォルダの中にあるすべてのファイルの名前を、拡張子なしで取得します。
フォルダの中にあるフォルダについても中身を無視せずすべて取得してくれます。
import glob
import os
# 条件に合うファイルパス情報をすべて取得
file_list = glob.glob('folder1/folder2/**/*.*', recursive=True)
# パス情報からファイル名だけを取り出す
name_list = [os.path.splitext(os.path.basename(file))[0] for file in file_list]
print(name_list) # ['photo1', 'photo2', 'text', 'text.txt', 'music']
特定の拡張子がついたファイル名を取得したい(拡張子あり)
フォルダ内の特定の拡張子がついたファイルの名前を取得します(下の例では「png」)。
import glob
import os
# 条件に合うファイルパス情報をすべて取得
file_list = glob.glob('folder1/folder2/*.png')
# パス情報からファイル名だけを取り出す
name_list = [os.path.basename(file) for file in file_list]
print(name_list) # ['photo1.png', 'photo2.png']
特定の拡張子がついたファイル名を取得したい(拡張子なし)
フォルダ内の特定の拡張子がついたファイルの名前を、拡張子なしで取得します(下の例では「png」)。
import glob
import os
# 条件に合うファイルパス情報をすべて取得
file_list = glob.glob('folder1/folder2/*.png')
# パス情報からファイル名だけを取り出す
name_list = [os.path.splitext(os.path.basename(file))[0] for file in file_list]
print(name_list) # ['photo1', 'photo2']
特定の名前が入ったファイル名を取得したい(拡張子あり)
ファイル名に特定の文字列が入ったファイルを取得します。(下の例では「text」)
import glob
import os
# 条件に合うファイルパス情報をすべて取得
file_list = glob.glob('folder1/folder2/text.*')
# パス情報からファイル名だけを取り出す
name_list = [os.path.basename(file) for file in file_list]
print(name_list) # ['text.txt', 'text.txt.old']
特定の名前が入ったファイル名を取得したい(拡張子なし)
ファイル名に特定の文字列が入ったファイルを、拡張子なしで取得します。(下の例では「text」)
import glob
import os
# 条件に合うファイルパス情報をすべて取得
file_list = glob.glob('folder1/folder2/text.*')
# パス情報からファイル名だけを取り出す
name_list = [os.path.splitext(os.path.basename(file))[0] for file in file_list]
print(name_list) # ['text', 'text.txt']
おわりに:Pythonで色々なファイル名を取得してみました
今回はPythonでのファイル名取得について、色々なパターンを紹介してみました。
こういったフォルダ内のファイル名を取得してくる処理は、csvファイルを全部さらってきて内容を加工したいですとか、結構いろんな場面で出くわすことがあるのではないかと思います。
特に「動的に変わるからファイル名が分からない」「ファイルの数が数十、数百個ある」というような「ファイル名の情報をソースコードに持たせたくない(持てない)」場面でやりたい処理だと思います。
この記事が皆さんのお役に立てば幸いです。では!