今回は、特定のフォルダに入っているすべてのファイル名を取得したり、特定の拡張子のファイル名を取得する方法について解説します。
ファイル名を取得することで、フォルダ内のファイルを対象にループ処理などを行うことができますので、何かと便利です。
意外とよく使う技術なので、皆さんもぜひマスターしてください。
1. 現在のフォルダ内のファイル名を取得
まずは、現在のフォルダ内の全ファイル名を取得してみましょう。
基本的に、複数のファイル名を取得するには「glob」というライブラリを使用し、使い方は「glob.glob(ファイル指定)」という形です。
では、実際にコードを確認してみましょう。
まずは下のコードを保存し、その場所に適当にファイルを置いて実行してください。(私は下の画像のような環境で起動してみます)
import glob files = glob.glob("*") print(files)
これを実行すると、
[‘get_files.py’, ‘test1.txt’, ‘test2.txt’, ‘test3.txt’, ‘テスト1.txt’, ‘テスト2.txt’, ‘テスト3.txt’]
とファイル名がリスト形式で出力されます。
ポイントは、「glob.glob(“*”)」の部分で、ファイルの指定に使われている「*」をワイルドカードと呼びます。
ワイルドカードとは、「すべてのものが当てはまる」という意味になります。
ですので、今回のケースではフォルダ内のすべてのファイル名が当てはまり、すべて書き出される結果になっています。
また、ワイルドカードは名前の一部にも使うことができます。
それを用いて、今度は拡張子が「txt」のテキストファイルのみを取得してみます。下のコードを実行してください。
import glob files = glob.glob("*.txt") print(files)
すると、今回は[‘test1.txt’, ‘test2.txt’, ‘test3.txt’, ‘テスト1.txt’, ‘テスト2.txt’, ‘テスト3.txt’]と、テキストファイルのみ取得することができました。
「*.txt」とすることで、「*」の部分はなんでもよく、拡張子が「txt」となっているものだけ適応されるため、このようにテキストファイルのみ取得することができます。
ちなみに、ワイルドカードは名前の間に挟むこともできるため、下のようにすることで平仮名の名前のファイルのみ取得する、なんてこともできます。
import glob files = glob.glob("テスト*.txt") print(files)
以上が、ファイル名取得の基本となります。
- 複数のファイル名を取得するには「glob」というライブラリを使用
- 使い方は「glob.glob(ファイル指定)」
- ワイルドカードを使い、任意のファイル名を指定
2. 異なる階層のフォルダ内のファイル名を取得
次に、階層の異なるフォルダ内のファイル名を取得したいと思います。
階層を移動するには、Windowsの場合「\\(バックスラッシュ)」を用います。(本当は「\」一つで良いのですが、エスケープ文字の関係により2つ重ねます。)
※UNIXやMacの方は「/(スラッシュ)」を使用しましょう。
例えば、現在のフォルダから、「testf」というフォルダに移動したい場合は、「.\\testf」という風に書きます。
※ちなみに、現在階層の「.\\」は省略可能です。
また、「..」では一つ上の階層を表します。
簡単にまとめると、下のような形です。
表記 | 意味 | 例(下の画像参照) |
. | 現在の階層 | .\\test3 (test3を指定) |
.. | 一つ上の階層 | ..\\test1 (test1を指定) |
.\\フォルダ名 | フォルダの階層 | .\\testf\\test5 (test5を指定) |
ではこれらを踏まえて、異なる階層のファイル名を取得してみましょう!
今回は、「testf」というフォルダの中に先ほどのファイルを保存して取得してみます。以下を実行してみてください。
(下のように、プログラムのある階層に「testf」のフォルダを設置)
import glob files = glob.glob("testf\\*.txt") print(files)
これで、「testf」内のファイル名を取得できました。
出力結果
[‘testf\\test1.txt’, ‘testf\\test2.txt’, ‘testf\\test3.txt’, ‘testf\\テスト1.txt’, ‘testf\\テスト2.txt’, ‘testf\\テスト3.txt’]
取得したファイル名には、「testf\\」というファイルパスがついていますが、ループ処理を行う場合、このファイルパスがついている方が都合が良いです。
どうしてもファイル名のみ取得したい方は、下のようにループ処理で除外しましょう。
files2 = [] for file in files: fnam = file.split("\\") files2.append(fnam[1]) print(files2)
これで、異なるフォルダ内のファイル名についても取得することができました。
- 階層を移動するには「\\」を用いる
- 「.」が現在の階層を表す
- 「..」が一つ上の階層を表す
- 「ファイル名」でファイルの階層を表す
3. 複数のフォルダ内のファイル名を取得
次に、複数のフォルダ内にあるファイルの名前の取得方法について解説します。
今回も「*(ワイルドカード)」が活躍します!
実はワイルドカードはファイル名だけでなく、フォルダ名にも使えます。
では、実際にワイルドカードを用いて複数のフォルダを指定してみましょう。
(下のように、「testf1」と「testf2」をプログラムのある場所に作成し、その中に先ほどのテキストファイルを配置しています。)
import glob files = glob.glob("testf*\\*.txt") print(files)
これで、2つのフォルダにまたがったファイル名も下のように取得するすることができました。
出力結果
[‘testf1\\test1.txt’, ‘testf1\\test2.txt’, ‘testf1\\test3.txt’, ‘testf2\\テスト1.txt’, ‘testf2\\テスト2.txt’, ‘testf2\\テスト3.txt’]
これで、どの場所にあるファイルでも名前を取得することができるようになりました。
- ワイルドカードは、ファイル名だけでなくフォルダ名にも使用可能
- 「*\\*.txt」のようにすることで複数のフォルダを指定
4. 取得したファイル名を使ってループ処理を実行
最後に、取得したファイル名を使ったループ処理について少し触れておきたいと思います。
今回は、ループ処理を用いてすべてのファイルにファイル名を記入してみようと思います。
import glob files = glob.glob("*\\*.txt") for file in files: with open(file, "w") as f: f.write("このファイルは「"+ file + "」です。")
上のようにすることで、すべてのファイルにファイル名を記入することができました。
(例として、テスト1.txtの中は下のようになっています。)
このように、取得したファイル名を用いてループ処理を行うことで、複数のファイルに同様の処理を行うことができます。
今回はファイルに書き込みを行いましたが、実際よく使うのは「データの読み込み」です。
リストを用いたループ文に疑問がある方は、下の記事で解説していますのでそちらもご覧ください。
- 取得したファイル名を用いてループ処理を行うことで、複数のファイルに同様の処理を行うことができる。
- 複数データの読み込み時に非常に便利
5. おわりに
今回は、複数ファイルの名前を取得する方法について解説しました。
データの読み込みなどを行う際は、今回の方法を使えるととても便利なので、ぜひ皆さんも使えるようになってください。
なお、このサイトでは初心者の方向けに「Python初心者入門講座」という講座を作っていますので、気になった方はそちらもご覧いただけると幸いです。
コメント