初学者の統計学習ノート統計学およびR、Pythonでのプログラミングの勉強の過程をメモっていくノート。Pythonちょっとした作業のメモです。わたし初心者ですのでヘンなことをやってる可能性あります。指定したディレクトリ配下のディレクトリ名やファイル名を取得しようと思い、↓のページを参考に作業しました。qiita.comただ、以下のような変更を行いました。リストが欲しかったのでリストを返すようにした。指定したディレクトリそのものは要素として必要ないので、出力しないようにした。オプションで、フルパスを返すか、指定したディレクトリからの相対パスだけ返すか選択できるようにした。オプションで、"."で始まるシステムファイルやシステムフォルダを除くかどうか選択できるようにした。ドキュメントに載っている。留意点こんなんでいいんだろうかと自分でも思っている留意点をいくつか挙げておきます。(os.walkが返してくる)ジェネレータとかいうものの操作方法がよくわからなかったので、関数定義の中にまた関数定義を入れているのだが、もっと簡単な方法ないのだろうか。ジェネレータについて、以下の記事は斜め読みしてフムフムとおもた。忘れる脳みそのためのメモ関数として定義されるがオブジェクトのように動くみたいなことが書かれているので、関数定義の中に関数定義でもこれは仕方のないことなのかな?相対パスだけ取りたい場合ですが、os.walk()のfilenamesだけ取ると指定したディレクトリ配下のディレクトリ構造が無視されてファイル名だけ返る。os.path.join()でフルパスを得た後で、指定ディレクトリまでのパスをテキストとして削除することにした。下の階層で同じパスが出てこないとも限らないので、左端からみていって1回だけ削除することにしている(re.sub()のcount=1)。このやり方だと、ディレクトリを指定するときに最後に"/"を書かない場合、返ってくるファイル名等が"/"で始まるようになってしまうので、最後に.lstrip('/')で取り除いている。フルパスについてはos.walk()が返す"dirpath"と"filenames"を連結し、指定ディレクトリからの相対パスはos.path.relpath()で取ることにした。システムファイルの指定は'/.'が含まれるという条件でいいのかは自信がない。わたしMacなんですが、.appとかはファイルではなくディレクトリとして認識されて中身が全部一覧化されます。オプションで一覧化させないようにするための処理はまた後で付け足したほうがいいのかもしれない。コード(修正あり)以下のようなコードを書きました。コメント欄で戴いた指摘を反映して修正しました。Macでやってますが、Windowsでやるときはパスの書き方が違うので修正が必要なので後述します。あと、私はPython3でやっています。return(list)これでインタラクティブシェルで、以下のように操作すると取得できました。追記:Windowsの場合Windowsの場合、とにかくパスの問題がめんどくさいです。cocodrips.hateblo.jp↑の記事を参考にして、無理やりな方法で動かしてみました。関数定義は次のとおりです。return(list)Windowsのパスは"\"で区切って指定するわけですが、"\"はPythonのコード上では特殊文字として扱われてしまう。stringの形式で入力する必要がある。"/"で区切ってもじつはPythonは認識してくれる。上のコードでは、どっちで入力されても大丈夫。os.sepがディレクトリの分割記号を表すことを利用することもできる。os.walkとos.pathの組み合わせで生成されるパスは"\\"と重ねてエスケープする方式で返ってきたのだが、上述のように最後に文字列置換するやり方だと、検索でちゃんと当てるのが難しかったので、最後にos.sepを"/"に置き換えている。