パス操作したい(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_textwrite_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オプションでエンコーディングエラーが発生した場合の処理方法を設定できます。 デフォルトはstrictUnicodeEncodeErrorの例外が発生します。

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=Trueexist_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オブジェクトとして取得できます。

リファレンス