pathlib.Pathを調べる
最近はPython3.4以降の環境でスクリプトを作っているため、osモジュールからpathlibモジュールを利用するように方針を変えている。
そこで、pathlib.Pathの使えそうなメソッドを調べることにした。
まずはimport
1 | from pathlib import Path |
メインクラスをimportする。
ディレクトリ内のファイル・ディレクトリを取得する。
1 2 3 | p = Path('C:/Windows') for path in p.iterdir(): print(path) |
iterdir()で返却されるのはPathのイテレータ。なので、さまざまなpathのメソッドを呼び出すことができる。
ディレクトリかファイルかを判定する。
1 2 3 4 5 6 7 8 | p = Path('C:\', 'Windows') for path in p.iterdir(): if path.is_dir(): print('Directory:{}'.format(path)) elif path.is_file(): print('File :{}'.format(path)) else: print('? :{}'.format(path)) |
pathはPathクラスのインスタンスなので、そのメソッドを呼び出せばよい。
なお、Path()の引数は、os.path.joinのように、カンマ区切りで指定しても良い。
パスの追加
1 2 3 4 | p = Path('C:\', 'Windows') q = p / 'System32' for path in q.iterdir(): print(path) |
演算子’/’がオーバーロードされている。カッコいい。ただ、あまり使うことはない気がする。
ファイルを開く
1 2 3 4 | p = Path('C:\', 'Windows', 'System32', 'drivers', 'etc', 'hosts') with p.open(encoding='UTF-8') as r: for line in r: print(line) |
pathインスタンスからそのままファイルオープンすることができる。エンコーディングも指定できる。便利。
ドライブ名の取得、パスの分解
1 2 3 | p = Path('C:\', 'Windows', 'System32', 'drivers', 'etc', 'hosts') print(p.drive) print(p.parts) |
ドライブ名はWindows独自。
partsも何かに使えるかな?partsに対してinして、フィルタする?
parentsとparent
1 2 3 4 5 | p = Path('C:\', 'Windows', 'System32', 'drivers', 'etc', 'hosts') print(p.parent) print(p.parents[0]) print(p.parents[1]) print(p.parents[2]) |
parentは親、parentsは指定階層上の親。2階層上や3階層上の親が欲しい場合もあるかも。
名前、拡張子、拡張子なしの名前
1 2 3 4 5 | p = Path('C:\', 'var', 'log', 'accesslog.tar.gz') print(p.name) print(p.suffix) print(p.suffixes) print(p.stem) |
nameはファイル名またはディレクトリ名(accesslog.tar.gz)。
suffixは末端の拡張子(.gz)。
suffixesは拡張子のリスト([.tar, .gz])。
stemは拡張子(suffix)を除いたファイル名(accesslog.tar)。
カレントディレクトリ、ホームディレクトリ
1 2 | print(Path.cwd()) print(Path.home()) |
地味だけど便利そう。
※ home()はPython3.5以降。
ファイルステータス
1 2 3 4 | p = Path('C:\', 'Windows', 'System32', 'drivers', 'etc', 'hosts') stat = p.stat() print(stat.st_size) print(stat.st_mtime) |
os.stat()と同様の結果を得られる。ファイルサイズや作成日、更新日など。
パスが存在するかどうか
1 2 3 4 5 | p = Path('C:\', 'Windows', 'System32') if p.exists(): print('exists') else: print('not exists') |
ファイル出力前に使えそう。
ファイル入力前はis_file()がよさそう。
再帰的なディレクトリ走査
1 2 3 4 | for path in Path('C:\', 'Windows', 'System32').glob('**/*.dll'): print(path) for path in Path('C:\', 'Windows', 'System32').rglob('*.dll'): print(path) |
glob()の引数の’**/’が再帰を表す。単一階層であれば’*.dll’を指定する。これは使えそう。
rglob()は常に再帰する。どちらでも覚えやすい方を使えばよいと思う。
ディレクトリ作成
1 2 | p = Path('F:/work1/work2/work3') p.mkdir(parents=True) |
ディレクトリを作成する。parent=Trueを指定することで、再帰的にディレクトリを作成してくれる。osモジュールのos.makedirs()の様に動く。
これは便利。
単純なファイルの読み書き ※Python3.5以降
1 2 3 4 | p = Path('C:\', 'Windows', 'System32', 'drivers', 'etc', 'hosts') text = p.read_text(encoding='UTF-8') p = Path('F:\', 'temp.txt') p.write_text(text, encoding='UTF-8') |
read_text()でファイル全体を読み込み、write_text()で引数の文字列を一気に書き出す。ファイルサイズによっては使えそう。
※ Python3.5以降
名前変更
1 2 | p = Path('F:\\temp.txt') p.replace('F:\\work\new.txt') |
replace()でファイル名を変更できる。途中のディレクトリを勝手に作ってくれることはないので、そこはあらかじめ準備しておく。
touch
1 2 | p = Path('F:\\temp2.txt') p.touch() |
シェルコマンドのtouchと同様。現在日時で0バイトファイルを作成する。
まとめ
なかなか良いモジュールだ。
再帰走査ができるし、そのままエンコードを指定して読み込むこともできるし、足りないことの方が見つからない。これからはどんどん使っていこう。もうPython2.7には戻れない。
- BOM付きUTF-8からBOMを除去するpython
- jythonのヒープメモリ設定
- Kotlin1.2.50がリリースされていた
- macOSをHigh Sierraに更新した。スクリプト実行環境のバージョンは変わったのか
- macOSをMojaveに更新した。スクリプト実行環境のバージョンは変わったか
- pyenvでpython環境をインストール
- pyenvとvirtualenvでpython環境を構築
- python unpack
- python3で数値のlistを文字列のlistに変換
- pythonからchromeを操作する