📘
学習記録_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()) # 読み込む
is_relative_to()
の意味
1-3. - 基準パスに対して相対パスかどうかを判定するメソッド。
- 例:
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
path.write_text()
は上書き?
2-1. - デフォルトで 上書きされる。追記するには
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 操作
newline=''
の意味
3-1. - 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