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には戻れない。
同じタグの記事
同じカテゴリの記事