Posted at

pythonでフォルダ内のファイル一覧をパス無しで取得する

More than 3 years have passed since last update.

pythonでフォルダの中を見る時ファイル名、ディレクトリ名は欲しいけどパスは要らないって場合には何が一番よいやり方なのでしょうね...

例えばtestディレクトリに以下の様なファイルが存在するとして

test.csv

test.py
test.sh
test.txt
test1
test2
test3

globモジュールを使ったとするとこうなりますよね。


>>> import glob
>>> glob.glob('test/*')
['test/test.csv', 'test/test.py', 'test/test.sh', 'test/test.txt', 'test/test1', 'test/test2', 'test/test3']

ただ、理想としては


>>> import hoge
>>> hoge.hoge('test/*')
['test.csv', 'test.py', 'test.sh', 'test.txt', 'test1', 'test2', 'test3']

このようになって欲しいのです。

 

以下の様な方法もありますが、ワイルドカード指定が出来ないのは辛い。


>>> import os
>>> os.listdir('test/')
['test.csv', 'test.py', 'test.sh', 'test.txt', 'test1', 'test2', 'test3']

 

 

 

以上を踏まえて私が思いついたのは以下の3つ

その中でもよく使うのがcommandsを使う方法です。

>>> import commands

>>> commands.getoutput('ls test/* | xargs -n 1 basename').split("\n")
['test.csv', 'test.py', 'test.sh', 'test.txt', 'test1', 'test2', 'test3']

 

他にはやはりglobモジュールで得たpathのbasenameだけ得るのが正攻法でしょうか。


>>> import glob
>>> [r.split('/')[-1] for r in glob.glob('test/*')]
['test.csv', 'test.py', 'test.sh', 'test.txt', 'test1', 'test2', 'test3']

>>> import glob, os
>>> [os.path.basename(r) for r in glob.glob('test/*')]
['test.csv', 'test.py', 'test.sh', 'test.txt', 'test1', 'test2', 'test3']

 

 

皆様はどのようにしているのか気になったのでとりあえず自分の方法を書いてみました。

なにかいい方法があればご教授下さい。