Python - file, pathlibメモ

まえがき

ファイル入出力はプログラミングにはどうしても付いて回る。

pathlib

pythonにおいて、pathという概念をより忠実に表現できるようになった。のかな?
os.path や shutilなどのこれまでのpathを扱うライブラリとは、文字列に変換しないと連携できない。

サンプル

#!/usr/bin/env python3
# coding: utf-8
"""python script
"""

import os
import pathlib
import shutil


def main():
    """main
    """
    # 作業ディレクトリ
    cwd = pathlib.Path('.')
    # os.path に渡す場合は文字列にする
    abscwd = pathlib.Path(os.path.abspath(str(cwd)))
    # 親ディレクトリ。pathlib.Pathで取得
    parent = abscwd.parent
    # pathの連結
    child = parent.joinpath('test')
    # path に対して globとかできる
    for pytihon_file in cwd.glob('**/*.py'):
        # 拡張子を含むファイル名
        print(python_file.name)
        # 拡張子のみ
        print(python_file.suffix)
        # ファイル名のみ
        print(python_file.stem)
        # など色々なpath操作ができる


if __name__ == '__main__':
    main()

ファイル入出力

pathlibからそのままファイルオープンできる。
テキストファイルを扱う場合はエンコード指定して、入出力の境界でデータ形式を整える。
なるべく with 構文を使う。

サンプル

#!/usr/bin/env python3
# coding: utf-8
"""python script
"""

import pathlib


def main():
    """main
    """
    src = pathlib.Path('./src.txt')
    # テキストの時 エンコード指定できるので、する
    with src.open(mode='r', encoding='utf-8') as fin:
        # python の文字列型になっている
        for line in fin:
            print(line)

    dst = src.with_name('dst.txt')
    with dst.open(mode='w', encoding='utf-8') as fout:
        # utf-8 で書き込まれる
        fout.write('12345')

    src = pathlib.Path('./src.bin')
    with src.open(mode='rb') as fin:
        data1 = fin.read(1)
        data2 = fin.read(2)
        data3 = fin.read(3)

    dst = src.with_name('dst.bin')
    with dst.open(mode='wb') as fout:
        fout.write(data1)
        fout.write(data2)
        fout.write(data3)


if __name__ == '__main__':
    main()

See also