読者です 読者をやめる 読者になる 読者になる

StatsBeginner: 初学者の統計学習ノート

初学者が統計学、R、Pythonの勉強の過程をメモっていくノート。

作業&勉強メモ: Pythonで指定したディレクトリ配下のディレクトリ名とファイル名を取得する

プログラミング Python

 ちょっとした作業のメモです。わたし初心者ですのでヘンなことをやってる可能性あります。
 
 
 指定したディレクトリ配下のディレクトリ名やファイル名を取得しようと思い、↓のページを参考に作業しました。


qiita.com


 ただ、以下のような変更を行いました。

  • リストが欲しかったのでリストを返すようにした。
  • 指定したディレクトリそのものは要素として必要ないので、出力しないようにした。
  • オプションで、フルパスを返すか、指定したディレクトリからの相対パスだけ返すか選択できるようにした。
  • オプションで、"."で始まるシステムファイルやシステムフォルダを除くかどうか選択できるようにした。


 os.walk()の公式な説明は、
 16.1. os — 雑多なオペレーティングシステムインタフェース — Python 3.3.6 ドキュメント
 に載っている。

 

留意点

 こんなんでいいんだろうかと自分でも思っている留意点をいくつか挙げておきます。
 
 
 まず、ジェネレータとかいうものの操作方法がよくわからなかったので、関数定義の中にまた関数定義をしていますw
 正式にはどうやればいいんだろ・・・?
 以下の記事は斜め読みしてフムフムとおもた。
 Python のジェネレータ (1) - 動作を試す | すぐに忘れる脳みそのためのメモ


 相対パスだけ取りたい場合ですが、os.walk()のfilenamesだけ取ると指定したディレクトリ配下のディレクトリ構造が無視されてファイル名だけ返る。どうすればいいかよく分からなかったので、とりあえず、
 yield os.path.join()
でフルパスを得た後で、指定ディレクトリまでのパスをテキストとして削除することにした。下の階層で同じパスが出てこないとも限らないので、左端からみていって1回だけ削除することにしている(re.sub()のcount=1)。
 このやり方だと、ディレクトリを指定するときに最後に"/"を書かない場合、返ってくるファイル名等が"/"で始まるようになってしまうので、最後に.lstrip('/')で取り除いている。


 システムファイルの指定は'/.'が含まれるという条件でいいのかは自信がない。


 わたしMacなんですが、.appとかはファイルではなくディレクトリとして認識されて中身が全部一覧化されます。オプションで一覧化させないようにするための処理はまた後で付け足したほうがいいのかもしれない。

コード

 以下のようなコードを書きました。

def listdir_all(path, fullpath=False, sysfile=False):
    import os, re
    
    # 指定ディレクトリの配下にあるディレクトリやファイルのフルパスを生成する関数
    def gene(path):
        for dirpath, dirnames, filenames in os.walk(path):
            yield dirpath
            for name in filenames:
                yield os.path.join(dirpath, name)
    
    # リストにする
    list = [file for file in gene(path)]
    
    # 1個目は指定ディレクトリ自身であり不要なので消す
    list = list[1:]
    
    # .で始まるシステムファイルを除去する
    if sysfile == False:
        for file in list:
            if '/.' in file:
                list.remove(file)
    
    # フルパス又は指定ディレクトリからの相対パスを返す
    if fullpath == True:
         return(list)
    else:
        list = [re.sub(path, '', file, count=1) for file in list]
        list = [file.lstrip('/') for file in list]
        return(list)


 これでインタラクティブシェルで、以下のように操作すると取得できました。

>>> filedir = 'たとえばMacの壁紙フォルダのパス'
>>> names_list = listdir_all(filedir, fullpath=False, sysfile=False)
>>> print(names_list)
['Default Collections', 'Default Collections/1-National Geographic', 'Default Collections/1-National Geographic/NatGeo01.jpg', 'Default Collections/1-National Geographic/NatGeo02.jpg', 'Default Collections/1-National Geographic/NatGeo03.jpg', 'Default Collections/1-National Geographic/NatGeo04.jpg', 'Default Collections/1-National Geographic/NatGeo05.jpg', 'Default Collections/1-National Geographic/NatGeo06.jpg', 'Default Collections/1-National Geographic/NatGeo07.jpg', 'Default Collections/1-National Geographic/NatGeo08.jpg', 'Default Collections/1-National Geographic/NatGeo09.jpg', 'Default Collections/1-National Geographic/NatGeo10.jpg', 'Default Collections/1-National Geographic/NatGeo11.jpg', 'Default Collections/1-National Geographic/NatGeo12.jpg', 'Default Collections/1-National Geographic/NatGeo13.jpg', 'Default Collections/1-National Geographic/NatGeo14.jpg', 'Default Collections/1-National Geographic/NatGeo15.jpg', 'Default Collections/1-National Geographic/NatGeo16.jpg', 'Default Collections/1-National Geographic/NatGeo17.jpg', 'Default Collections/2-Aerial', 'Default Collections/2-Aerial/Aerial01.jpg', 'Default Collections/2-Aerial/Aerial02.jpg', 'Default Collections/2-Aerial/Aerial03.jpg', 'Default Collections/2-Aerial/Aerial04.jpg', 'Default Collections/2-Aerial/Aerial05.jpg', 'Default Collections/2-Aerial/Aerial06.jpg', 'Default Collections/2-Aerial/Aerial07.jpg', 'Default Collections/2-Aerial/Aerial08.jpg', 'Default Collections/2-Aerial/Aerial09.jpg', 'Default Collections/3-Cosmos', 'Default Collections/3-Cosmos/Cosmos01.jpg', 'Default Collections/3-Cosmos/Cosmos02.jpg', 'Default Collections/3-Cosmos/Cosmos03.jpg', 'Default Collections/3-Cosmos/Cosmos04.jpg', 'Default Collections/3-Cosmos/Cosmos05.jpg', 'Default Collections/3-Cosmos/Cosmos06.jpg', 'Default Collections/3-Cosmos/Cosmos07.jpg', 'Default Collections/3-Cosmos/Cosmos08.jpg', 'Default Collections/3-Cosmos/Cosmos09.jpg', 'Default Collections/4-Nature Patterns', 'Default Collections/4-Nature Patterns/NaturePatterns01.jpg', 'Default Collections/4-Nature Patterns/NaturePatterns02.jpg', 'Default Collections/4-Nature Patterns/NaturePatterns03.jpg', 'Default Collections/4-Nature Patterns/NaturePatterns04.jpg', 'Default Collections/4-Nature Patterns/NaturePatterns05.jpg', 'Default Collections/4-Nature Patterns/NaturePatterns06.jpg', 'Default Collections/4-Nature Patterns/NaturePatterns07.jpg', 'Default Collections/4-Nature Patterns/NaturePatterns08.jpg', 'Desktop Pictures', 'Desktop Pictures/Abstract.jpg', 'Desktop Pictures/Antelope Canyon.jpg', 'Desktop Pictures/Bahamas Aerial.jpg', 'Desktop Pictures/Beach.jpg', 'Desktop Pictures/Blue Pond.jpg', 'Desktop Pictures/Bristle Grass.jpg', 'Desktop Pictures/Brushes.jpg', 'Desktop Pictures/Circles.jpg', 'Desktop Pictures/Death Valley.jpg', 'Desktop Pictures/Desert.jpg', 'Desktop Pictures/Ducks on a Misty Pond.jpg', 'Desktop Pictures/Eagle & Waterfall.jpg', 'Desktop Pictures/Earth and Moon.jpg', 'Desktop Pictures/Earth Horizon.jpg', 'Desktop Pictures/Elephant.jpg', 'Desktop Pictures/Flamingos.jpg', 'Desktop Pictures/Floating Ice.jpg', 'Desktop Pictures/Floating Leaves.jpg', 'Desktop Pictures/Foggy Forest.jpg', 'Desktop Pictures/Forest in Mist.jpg', 'Desktop Pictures/Foxtail Barley.jpg', 'Desktop Pictures/Frog.jpg', 'Desktop Pictures/Galaxy.jpg', 'Desktop Pictures/Grass Blades.jpg', 'Desktop Pictures/Hawaiian Print.jpg', 'Desktop Pictures/Isles.jpg', 'Desktop Pictures/Lake.jpg', 'Desktop Pictures/Lion.jpg', 'Desktop Pictures/Milky Way.jpg', 'Desktop Pictures/Moon.jpg', 'Desktop Pictures/Mountain Range.jpg', 'Desktop Pictures/Mt. Fuji.jpg', 'Desktop Pictures/Pink Forest.jpg', 'Desktop Pictures/Pink Lotus Flower.jpg', 'Desktop Pictures/Poppies.jpg', 'Desktop Pictures/Red Bells.jpg', 'Desktop Pictures/Rice Paddy.jpg', 'Desktop Pictures/Rolling Waves.jpg', 'Desktop Pictures/Shapes.jpg', 'Desktop Pictures/Sky.jpg', 'Desktop Pictures/Snow.jpg', 'Desktop Pictures/Underwater.jpg', 'Desktop Pictures/Wave.jpg', 'Desktop Pictures/Zebras.jpg']