ファイルシステムの階層を辿る¶
異なるディレクトリの情報を扱うために、パスの扱いを確認します。
パスを連結する¶
os.path.join() を使うことで、Windows など異なるアーキテクチャのパス区切り文字を意識せずにファイルパスを扱えます。 引数の数は可変長になっていますので、3つや4つもそのまま連結できます。
>>> import os
>>> os.path.join(".", "src", "pyschool")
'./src/pyschool'
モジュールのインポートでは下位パッケージまで指定することが一般的ですが、 os.path に限っては os だけをインポートした方が良いでしょう。 実際に読み込むファイルは実行環境に依存するためです。 詳細は難しいかもしれませんが、「インポートするにもいくつかの方法がある」と覚えておきましょう。
os.path (リリース 3.3 の日本語ドキュメント)
OS によって異なるパス名の決まりがあるため、標準ライブラリにはこのモジュールのいくつかのバージョンが含まれています。 os.path モジュールは常に現在 Python が動作している OS に適したパスモジュールであるため、ローカルのパスを扱うのに適しています。 各々のモジュールをインポートして 常に 一つのフォーマットを利用することも可能です。これらはすべて同じインタフェースを持っています:
- posixpath UNIX スタイルのパス用
- ntpath Windows パス用
- macpath 古いスタイルの MacOS パス用
- os2emxpath OS/2 EMX パス用
ファイル操作いろいろ¶
ファイルをコピーするには shutil モジュールの copy() 関数を使います。
- 11.10. shutil — High-level file operations (公式ドキュメント)
>>> import shutil
>>> shutil.copy("README.rst", "README.rst.backup")
>>> import os
>>> os.system("ls README*")
>>> os.unlink("README.rst.backup")
公式ドキュメントのサンプルスクリプトにも目を通しておきましょう。 アーカイブの作成方法なども掲載されています。
ファイルシステムの階層を辿る¶
os.walk() を使うことで階層的にファイルシステムを走査できます。 使い方は独特なので、公式ドキュメントの例にも目を通しておいてください。
たとえば、カレントディレクトリ配下にある XML ファイルの一覧を出力するには次のように書きます。
>>> import os
>>> for root, dirs, files in os.walk("."):
... xmls = filter(lambda f: f.endswith(".xml"), files)
... for xml in xmls:
... print(os.path.join(root, xml))
...
宿題¶
- 指定ディレクトリ配下の直近1週間で更新されたファイルの一覧を表示してください。
- バージョン管理されたディレクトリには、 ”.svn” や ”.git” のようなディレクトリが存在します。 os.walk() を使ったときに、これらを除外するスクリプトを記述してください。
- Emacs や Vim のバックアップファイルを除外するフィルタを記述してください。