パス操作したい(pathlib
)
1from pathlib import Path
パス操作をするための標準モジュールです。
Python3
で新しく追加されました(はず)。
pathlib.Path
オブジェクトを使うことで、
os.path
モジュールと同じことが、
よりオブジェクトっぽく操作できます。
ファイル名のリストを取得したい
1p = Path("ディレクトリ名")
2fnames = sorted(p.glob("*.csv"))
ディレクトリ内にあるファイルの拡張子などを指定して、ファイル名のリストを取得できます。
Path.glob(パターン)
だとジェネレーターが返ってくるので、
sorted
して、ファイル名の順番に並べたリスト型に変換しています。
ファイルを開きたい(open
)
1# ファイルを開いて、データを読み込む
2p = Path("入力ファイル名")
3with p.open("r") as f:
4 lines = f.read()
5
6# ファイルを開いて、データを書き込む
7o = Path("出力ファイル名")
8with o.open("w") as f:
9 f.write(lines)
open
メソッドでファイル(のポインター)を取得できます。
また、コンテキストマネージャー(with ... as
構文)と組み合わせて、
ファイル操作ができます。
注釈
読み込む/書き込むデータがテキストデータとわかっている場合は、
より簡便なread_text
、write_text
メソッドがあります。
1# これまでの開き方
2p = Path("ファイル名")
3with open(p, "r") as f:
4 # ファイル操作
Pathオブジェクトは、従来のopen
関数の引数に直接渡すことができます。
ファイルから読み込みたい(read_text
/ read_bytes
)
1p = Path("ファイル名")
2p.read_text(encoding="utf-8") # mode="r"
3p.read_bytes() # mode="rb"
reat_text
メソッドで、ファイルからテキストデータを読み込めます。
エンコーディングはデフォルトでUTF-8ですが、encoding
オプションで変更できます。
バイナリーデータを読み込む場合はread_bytes
を使います。
これらのメソッドの内部処理では
コンテキストマネージャーを使っています。
1with p.open(mode="r", encoding="utf-8") as f:
2 lines = f.read()
open
メソッドを使って、コンテキストマネージャーを明示的に書いたサンプルです。
テキストデータの場合はmode="r"
、
バイナリデータの場合はmode="rb"
に設定します。
ファイルに書き込みたい(write_text
/ write_bytes
)
1p = Path("ファイル名")
2p.write_text("テキストデータ", encoding="utf-8") # mode="w"
3p.write_bytes("バイナリーデータ") # mode="wb"
write_text
メソッドで、ファイルにテキストデータを書き込めます。
encoding
オプションでエンコーディングを変更できます。
デフォルトはシステムのエンコーディングです(Linux/macOSだとutf-8
)。
errors
オプションでエンコーディングエラーが発生した場合の処理方法を設定できます。
デフォルトはstrict
でUnicodeEncodeError
の例外が発生します。
newline
オプションで改行コードを変更できます。
デフォルトはNone
でシステムの改行コードが指定されます。
バイナリーデータを書き込む場合はwrite_bytes
を使います。
これらのメソッドの内部処理では
受け取ったデータの型チェックと、
コンテキストマネージャーを使っています。
1# with...as構文
2with p.open(mode="w", encoding="utf-8") as f:
3 f.write("テキストデータ")
open
メソッドを使って、コンテキストマネージャーを明示的に書いたサンプルです。
テキストデータの場合はmode="w"
、
バイナリデータの場合はmode="wb"
に設定します。
ディレクトリを作成したい(mkdir
)
1p = Path("ディレクトリ名")
2p.mkdir()
mkdir
メソッドでディレクトリを作成できます。
すでにディレクトリが存在している場合はFileExistsError
となります。
1p = Path("ディレクトリ名")
2try:
3 p.mkdir()
4except FileExistsError as e:
5 print("ディレクトリはすでに存在します")
上書きを防止したい場合は、、try ... except:
でこのエラーをキャッチすればOKです。
1p = Path("ディレクトリ名/サブディレクトリ名/ファイル名.csv")
2# 親ディレクトリのPathオブジェクトを取得
3# p.parent => Path("ディレクトリ名/サブディレクトリ名")
4p.parent.mkdir(parents=True, exist_ok=True)
5p.write_text("テキストデータ")
中間ディレクトリも含めて作成することもできます。
ディレクトリを必ず作成したい場合は、parents=True
とexist_ok=True
オプションを設定します。
パスを連結したい
1fname = Path("../data", "data.csv")
2
3dname = Path("../data/")
4fname = data_dir / "data.csv"
複数の引数を指定すると、それらを連結したPath
オブジェクトが生成できます。
Path
オブジェクトは/
を使って連結できます。
Path
オブジェクトはファイルが存在しなくても作成できます。
パスを取得したい
1# ホームディレクトリ
2Path.home()
3
4# カレントディレクトリ
5Path.cwd()
ホームディレクトリとカレントディレクトリを取得するPath
のクラスメソッドがあります。
Path.home()
とPath.cwd()
でそれぞれのディレクトリ名をPath
オブジェクトとして取得できます。