Python 3.14では、pathlib.Pathだけでファイルやディレクトリーツリーをコピーできるcopy()とcopy_into()が追加されました。違いは保存先の渡し方です。ファイル名まで決めるならcopy()、元と同じ名前のまま既存フォルダーへ入れるならcopy_into()を選びます。
この記事は2026年10月9日に確認したPython 3.14の公式資料をもとにしています。説明用コードは練習用ファイルや最小CLIで確認するための例です。
先に結論:保存先の形で選ぶ
| メソッド | 渡す保存先 | この記事の結果 |
|---|---|---|
source.copy(target) | コピー後のパスを指定 | memo-renamed.txt(指定名) |
source.copy_into(target_dir) | 既存ディレクトリーを指定 | memo.txt(元名) |
Python 3.14公式ドキュメントのPath.copyでは、どちらも3.14で追加され、コピー先を指す新しいPathを返すと説明されています。元のsource変数がコピー先へ書き換わるわけではありません。
練習用ファイルで2種類のコピーを確認する
実ファイルを上書きしないよう、現在の作業フォルダーにpathlib_copy_practiceを作る例です。最初に実行中のPythonを確認し、3.14以上であることを確かめます。
python --version次をpathlib_copy_practice.pyとして保存します。必要な親フォルダーと、copy_into()へ渡す既存フォルダーは先に作成しています。
from pathlib import Path
import sys
if sys.version_info < (3, 14):
raise RuntimeError("Requires Python 3.14 or later")
base = Path("pathlib_copy_practice")
source_dir = base / "source"
copy_dir = base / "copy_target"
into_dir = base / "into_target"
for folder in (source_dir, copy_dir, into_dir):
folder.mkdir(parents=True, exist_ok=True)
source = source_dir / "memo.txt"
text = "Practice copy content\n"
source.write_text(text, encoding="utf-8")
copied_by_copy = source.copy(copy_dir / "memo-renamed.txt")
copied_by_into = source.copy_into(into_dir)
assert source.exists()
assert copied_by_copy.read_text(encoding="utf-8") == text
assert copied_by_into.read_text(encoding="utf-8") == text
print("source:", source)
print("copy:", copied_by_copy)
print("copy_into:", copied_by_into)
print("source retained:", source.exists())同じPythonコマンドで実行します。
python pathlib_copy_practice.py確認点は3つです。copy()側だけ名前がmemo-renamed.txtになり、copy_into()側は元のmemo.txtを保ちます。また、返り値を別変数で受け取っているため、sourceは元ファイルのパスのままです。最後に元ファイルも残っていれば、移動ではなくコピーとして確認できます。
上書きとオプションで迷いやすい点
元がファイルで、指定したコピー先に既存ファイルがある場合は置き換えられます。練習用データから始め、保存先を表示してから実データへ適用するのが安全です。既定値はfollow_symlinks=True、preserve_metadata=Falseです。前者はシンボリックリンクの参照先をコピーし、後者ではディレクトリー構造とファイルデータ以外のメタデータが保持されるとは限りません。Windowsのファイルコピーでは、preserve_metadataの指定にかかわらずメタデータが保持されます。詳細は日本語版pathlib公式資料で確認できます。
公式資料の注記によると、対応するOSとファイルシステムではコピーオンライトが使われる場合があります。ただし環境依存のため、速度向上や使用容量の削減を保証する機能として扱わないでください。
エラー時の切り分け
AttributeErrorになる:Python 3.13以前では両メソッドを利用できません。実際にスクリプトを動かすPythonの版を確認します。- 親フォルダーがない:
copy()が任意の親階層をすべて作るとは考えず、例のようにmkdir(parents=True, exist_ok=True)で先に用意します。 copy_into()が失敗する:渡すのは既存ディレクトリーです。ファイル名ではなくフォルダーを作ってから指定します。- 古い内容が消えた:同名の既存ファイルは上書き対象です。別名にするか、事前に
exists()で確認します。
まとめ
保存後の名前まで指定したいときはcopy()、既存フォルダーへ元の名前で入れたいときはcopy_into()です。どちらも返された新しいPathを受け取り、元のパスとコピー先を別々に確認すると混乱を防げます。
コピーしたファイルの圧縮も学びたい場合は、Python 3.14でZstandard形式を読み書きする方法も参考にできます。


コメント