まえがき
ファイル入出力はプログラミングにはどうしても付いて回る。
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()