英国でデータサイエンスを学ぶ

30代になってから海外で統計学・機械学習・プログラミングを勉強

MENU

pythonでディレクトリ内のファイル名を取得する方法

一回読み込んだら全てが終わるコードならいいのですが、ファイルを作成して保存してそれをまた取りこんでというような作業を行う時には、ディレクトリ内のファイル名を取得する必要がありましたので、その備忘メモです。


[目次]


基本的にCSVファイルを扱っていますので、その前提で対応するコードになります。

Pythonのglobモジュールを使用する方法

globモジュールで作業中のディレクトリ内の全てのファイル名を取得する方法

例えば、現在作業中のディレクトリ内にa.csv, b.csv, c.csvが存在している時、その全てのファイル名を取得したい場合はglobモジュールとワイルドカード(*)を使用して以下のように行います。

import glob
filenames = glob.glob("*")

これでfilenamesを出力してやると

>>> filenames
['a.csv', 'c.csv', 'b.csv']

とリストの要素にファイル名が入れられていることが分かります。

sort()を使用してglob()で取得したファイル名をアルファベット順に並び替える

上記の例からわかるように、取得したファイル名は必ずしもアルファベット順に並ぶ訳ではありません。
例えば、取得したファイル名をアルファベット順に処理したい場合など、このままでは困ってしまいます。そこで並び替えを行うにはsort()を用います。

filenames.sort()

これは(珍しく?)破壊的に並び替えを行うので、これだけてオブジェクトfilenamesの並び替えが実行されます。
結果を出力してみると、

>>> filenames
['a.csv', 'b.csv', 'c.csv']

となっています。

別のディレクトリ内に保存されているファイル名を取得

先程までの例では、作業中のディレクトリのファイル名を取得する方法でしたが、別ディレクトリのファイル名を取得する場合は、そのディレクトリを指定する必要があります。
例えば現在作業中のディレクトリの中にtest_directoryというディレクトリがありさらにその中にファイルd.csv, e.csvが保存されている場合、それらファイル名を取得するには以下のようにコードを書きます。

macの場合

import glob

filenames = glob.glob("./test_directory/*")

これによりfilenamesに取り込まれたのはディレクトリ名まで含めたものになります。
具体的には、

>>> filenames
['./test_directory/d.csv', './test_directory/e.csv']

この表記のいいところは、例えばcsvの読み込みを行う時はそのまま使用できる点です。

import pandas as pd

df = pd.read_csv(filenames[0])

これでディレクトリを変更しなくとも別ディレクトリのファイルが読み込めます。

ファイル名を一括で修正

この場合、ディレクトリ名も含まれている状態ですので、ディレクトリ名を削除するには、無理やり変更すると以下のようになります。(何かいい方法があるといいのですが。私が知らないだけできっといい方法があると思うのですが。知っている方教えていただけると助かりますm(_ _)m)

filenames2 = [item.replace("./test_directory/","") for item in filenames]

やや無理やりな気がして仕方ないです。。。

windowsの場合

普段はmacを使用しているのですが、どうしてもwindowsを使用しないといけない場合があります。
世の中はやはりwindows中心なんですかね。。。
そんな時にそのままコードを使用したらエラーが出てしまいました。
原因は、フォルダの指定の仕方が間違っていたからです。具体的には以下のように直してあげる必要があります。

import glob

filenames = glob.glob(".\\test_directory\\*")

バックスラッシュ2つですね。

あとはmacの場合と同じです。

globモジュールを利用してファイル名を限定して取得

先程までの例では、ワイルドカード(*)を利用してディレクトリ内に存在する全てのファイルを取得していましたが、一部だけに限定したい場合は、限定する部分を指定すればうまくできます。


osモジュールを使用する場合

osモジュールの使い方をいまいち把握しきれておらず、最近はもっぱらglobを使用していますが、簡単には以下のような使用方法が可能です。
globの例と同じように、ディレクトリ内にa.csv, b.csv, c.csvが保存されている時に、それらを表示する方法です。

import os

filenames = os.listdir(path="./")

これでfilenamesの中身を見てやると、globの時と同じように

>>> filenames
['a.csv', 'c.csv', 'b.csv']

となってます。もし".DS_Store”が入っていたら、リストオブジェクトからは削除しておいてあげましょう。