2018年5月29日火曜日

Pyhon の pathlib を使ってみる

これまで、python で script を書く時に、ファイル一覧とかのハンドリングには、 os と glob を使っているが、 python 3.4以降では pathlibモジュールが標準ライブラリに追加されたということを知って、 調べてみた。
あくまで、初心者がメモしたもので、使っているわけではないです。
  • python 3.4以前ならos.walk
  • glob

  • 相対パスでも指定可能
  • 絶対パスで指定した場合は絶対パスを返す
  • 相対パスは os.path.abspath で絶対パスへ変換
  • '*', '?', '[]' のワイルドカードが使える
  • ワイルドカードで「xxxを含まない」はできない
  • 再帰的検索は、 glob.glob("/test_dir/**.txt", recursive=True)
  • python 3.4以降、 pathlib が標準ライブラリに追加された。

  • open など python 標準の関数では、文字列の代わりにPathオブジェクトが使える。
  • 外部ライブラリでは、受け付けないものがあるらしい。
  • Pathオブジェクトの文字列への変換は、 Path.as_posix() とか str(Path)
  • 基本的な使い方

  • from pathlib import Path
    # from pathlib import PosixPath
    # from pathlib import PurePath
    
    # これは具象パス(Posixかwindowsのどちらか)になる
    #    pure_path = PurePath(c_path)
    #    posix_path = PosixPath(c_path)
    
    logger.info(Path.cwd())  # 現在のパス
    logger.info(PurePath())  # 現在のパス `.`
    
    logger.info(Path.home())  # ホームディレクトリのパス
    
    logger.info(Path('~/work/test').expanduser())  #  ~ および ~user を展開 
    
    # cd が出来ないみたい。
    os.chdir(Path('~/Documents/proj/gpxs').expanduser())
    
    c_path = Path.cwd()
    p_path = c_path.relative_to('/home/')  # 絶対パスから相対パス
    
    logger.info(c_path)
    logger.info(c_path.parts)  # パスの構成要素(タプル)
    logger.info(p_path)
    logger.info(p_path.parts)
    
    c_files = c_path.iterdir()  #
    logger.info([x for x in c_path.iterdir() if x.is_dir()])
    logger.info([x for x in c_path.iterdir() if x.is_file()])
    
    c_files = c_path.glob("tes*.dat")  #
    c_flist = list(c_path.glob("**/tes*.dat"))  # 相対だとglobが使えない
    
    logger.info(c_files)
    logger.info(c_flist)
    
    # for c_f in c_flist:
    for c_f in c_path.glob("tes*.dat"):
        logger.info(str(c_f))
        logger.info(c_f.root)  # ローカルまたはグローバルルート。あれば。
        logger.info(c_f.parent)  # 親ディレクトリ parents[0]
        logger.info(list(c_f.parents))  # 親ディレクトリ(list)
                                        # 最後がスラッシュなら、ファイル名が空として扱われる
        """[PosixPath('/home/hogehoge/Documents/proj/mp4tomp3'),
            PosixPath('/home/hogehoge/Documents/proj'),
            PosixPath('/home/hogehoge/Documents'),
            PosixPath('/home/hogehoge'),
            PosixPath('/home'),
            PosixPath('/')]"""
        logger.info(c_f.name)  # ローカルまたはグローバルルート。あれば。
        logger.info(c_f.stem)  # name から suffix を取る
        logger.info(c_f.suffix)  # ピリオドを含む
        logger.info(c_f.suffixes)  #
        logger.info(c_f.suffixes[-1])  #
    
        logger.info(c_f.exists())  #
        logger.info(c_f.match("/proj"))  #
        # logger.info(c_f.isfile())  #
    
        logger.info(c_f.stat())
        """
        os.stat_result(st_mode=33188, st_ino=2755182,
                       st_dev=2054, st_nlink=1, st_uid=1001, st_gid=1001,
                       st_size=5764,
                       st_atime=1528063195, st_mtime=1516928971, st_ctime=1516933101)
        """
        logger.info(c_f.stat().st_mode)
        logger.info(c_f.stat().st_size)
        logger.info(c_f.stat().st_mtime)
    
        logger.info(Path.chmod(mode))  # os.chmod() のようにファイルのモードとアクセス権限
        c_f.chmod(0o644)
    
        logger.info(c_f.with_name("hogetest.dat"))  # change name
        logger.info(c_f.with_suffix(".json"))  # ピリオドが必要
    
        c_p = c_f.parent / "testdir"
        c_p = c_f.parent.joinpath("testdir")
    
        logger.info(c_p.is_dir())  #
        c_p.mkdir(parents=False, exist_ok=True)
        c_p.rmdir()
    
        o_file = open(c_f, 'r')
        o_file.close()
        c_f.unlink()  # delete c_f
    
    # mv c_file new_file
    c_file.rename(new_file)
    
    # cp c_file new_file
    new_file.write_bytes(c_file.read_bytes())  # for bin files
    new_file.write_text(c_file.read_text())  # for text files
    
    # newest file in c_path
    m_time, file_path = max((f.stat().st_mtime, f) for f in c_path.iterdir())
    m_time, file_path = max((f.stat().st_mtime, f) for f in c_path.glob('*.dat'))
    
こうゆうのを使えば、少しは、らしい、 スクリプトになるのかしらん。

0 件のコメント:

コメントを投稿

麻のボディタオル

2018年の秋(まだ、自転車を封印してない)、 近江上布伝統産業会館 で、興味からボディタオルを購入した。 お、よかった。: 自然派パン工房 ふるさとの道 ほぼ毎日風呂で使ってきて、ついに寿命がきたようだ。 お店の方に、「糸が痩せて破れてくる」まで使える、と...