📘

学習記録_Python実践レシピ(第11章、第13章、第14章、第17章)

に公開

1. pathlib(パス操作)

1-1. 純粋パス(Pure paths)

  • PurePath は OS に依存せず、パス文字列を操作するだけ。
  • 実際のファイルやディレクトリが存在していなくても操作可能。
  • I/O を伴わないため、文字列操作感覚で使える
from pathlib import PurePath

p = PurePath("folder/subfolder/file.txt")
print(p.parent)  # folder/subfolder
print(p.name)    # file.txt
print(p.suffix)  # .txt

1-2. 具象パス(Concrete paths)

  • Path は OS に依存し、実際のファイルシステムと連動。
  • ファイルの存在確認、読み書き、コピー、移動などが可能。
from pathlib import Path

p = Path("example.txt")
print(p.exists())  # True or False
p.write_text("Hello")  # ファイルに書き込む
print(p.read_text())   # 読み込む

1-3. is_relative_to() の意味

  • 基準パスに対して相対パスかどうかを判定するメソッド。
  • 例:
p = Path("/home/user/docs/file.txt")
print(p.is_relative_to("/home/user"))  # True
print(p.is_relative_to("/etc"))        # False
  • 「単に文字列の先頭が同じか」ではなく、階層構造として基準パスの下かどうかを判定。

2. ファイル I/O と shutil

2-1. path.write_text() は上書き?

  • デフォルトで 上書きされる。追記するには append_text() を使う。
p = Path("a.txt")
p.write_text("new content")  # 上書き

2-2. shutil

  • コピーshutil.copyfile(src, dst) → データのみコピー

  • コピー + メタデータshutil.copy2(src, dst) → パーミッションやタイムスタンプもコピー

  • 削除shutil.rmtree(path) → ディレクトリごと削除

  • 移動shutil.move(src, dst)

    • 既存ファイルに上書きすると、元ファイルは消える
    • 理由:内部で os.rename やコピー+削除を行うため

3. CSV / TSV 操作

3-1. newline='' の意味

  • Python で CSV / TSV を扱うとき、改行コードの自動変換を抑制する
  • Windows の CRLF をそのまま扱える。

3-2. writerow() と writerows()

  • writerow(row) → 1 行書き込む
  • writerows(rows) → 複数行まとめて書き込む(リストやタプルのリスト)

4. urllib.parse

4-1. URL エンコード

  • parse.urlencode() で辞書を URL クエリ文字列に変換。
  • 特殊文字(非 ASCII)は自動エスケープされる。
from urllib import parse
params = {'key1': 1, 'key2': 'パイソン'}
print(parse.urlencode(params))  # key1=1&key2=%E3%83%91%E3%82%A4%E3%82%BD%E3%83%B3
  • doseq=True を使うと、値がリストの場合は複数の key=value に展開される。
params = {'key2': ['パイソン', 'Python']}
print(parse.urlencode(params, doseq=True))  # key2=パイソン&key2=Python
  • なぜ一部エスケープされないかquote_plus でスペースを + に変換する処理があり、文字列の組み合わせやリスト形式では個別処理される。

4-2. URL 操作

  • urljoin(base, url) → 相対パスを絶対パスに変換
from urllib import parse
print(parse.urljoin('https://ja.wikipedia.org/test/path/', '../../wiki/Python'))
# https://ja.wikipedia.org/wiki/Python
  • フル URL が渡された場合、base は無視される:
parse.urljoin('https://ja.wikipedia.org','https://www.example.com')
# https://www.example.com

5. Webスクレイピング

  • サーバに GET/POST リクエストを送り、レスポンスを取得する技術。
  • urlopen() で GET。
  • POST では dataバイト列にエンコードしたクエリ文字列 を渡す。
from urllib import request, parse
data = parse.urlencode({'key':'value'}).encode()
res = request.urlopen('https://httpbin.org/post', data=data)
print(res.status)  # 200

6. Base64

  • バイナリデータを ASCII 文字列に変換する方法。
  • altchars 指定可能。
  • validate=True → 標準以外の文字はエラー。

7. pdb デバッグ

  • set_trace() → 任意の場所で停止

  • pm() → 例外発生後に呼び出す

  • コマンド:

    • h → ヘルプ
    • w → スタック表示
    • p var → 変数表示
    • n → 次の行へ
    • c → 実行再開

8. timeit

  • コード実行時間計測。
  • コマンドライン例:
python -m timeit -s 'import random' 'random.random()'
  • -s → setup 文、計測対象外

  • デフォルト 1,000,000 回 × 5 セット → 最速値

  • 複数行も計測可能(try ... except

  • Timer クラス:

import timeit
timer = timeit.Timer('sum(range(100))', globals=globals())
print(timer.timeit(1000))

9. logging モジュール

9-1. 基本

  • ログ出力には ロガーハンドラー が関与
  • レベル:DEBUG < INFO < WARNING < ERROR < CRITICAL
import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug("debug")  # 表示される

9-2. format

  • asctime 時刻
  • funcName 関数名
  • lineno 行番号
  • module モジュール名
  • process プロセスID
  • thread スレッドID

9-3. ハンドラー

  • 出力先を指定するオブジェクト
  • RotatingFileHandler → サイズ制限でローテーション
  • TimedRotatingFileHandler → 時間制限でローテーション

9-4. 設定方法

  • dictConfig → dict 形式
  • fileConfig → INI 形式

10. プロセスとスレッド

  • process → 実行中のプロセス ID
  • thread → スレッド ID
  • threadName → スレッド名

✅ まとめ

  • pathlib: PurePath / Path、is_relative_to() の意味を理解
  • ファイル I/O: write_text() は上書き、shutil.copy/move/rmtree の挙動
  • urllib: GET/POST、file-like オブジェクト、URL encode/decode
  • pdb: set_trace / pm / 対話コマンド
  • timeit: -s, -n, -r, Timer クラス、globals
  • logging: ロガー・ハンドラー・フィルター・レベル・フォーマット・ローテーション
  • Base64: altchars, validate の注意点

Discussion