pathlib.Pathを調べる

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には戻れない。

同じタグの記事
同じカテゴリの記事

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA