サンプルコード
Python のサンプルコード一覧
Python で「○○するには」を解決するコードサンプル。59 件。
他の言語から探す
文字列を分割するには
`str.split` は区切り文字で分けたリストを返す。第2引数の `maxsplit` は「分割する回数」の上限なので、1 を渡すと要素は 2 個になる。引数なしで呼ぶと連続する空白をまとめて 1 つの区切りとして扱うため、空白区切りのテキストはこちらが扱いやすい。
文字列をUTF-8のバイト列にするには
文字列の `encode("utf-8")` でバイト列(`bytes`)になり、`len` は文字列なら文字数、バイト列ならバイト数を返す。戻すときは `decode("utf-8")` を使う。壊れたバイト列は既定で `UnicodeDecodeError` になり、`errors="replace"` を渡すと不正な部分が U+FFFD に置き換わる。
文字列をBase64にするには
b64encode はバイト列を受け取る関数なので、文字列は先に encode("utf-8") でバイト列にする。結果もバイト列で返るため、文字列として使うなら decode("ascii") で戻す。+ と / を - と _ に置き換えた URL セーフ版には urlsafe_b64encode を使う。
ファイルの文字コードを変換するには
open の encoding に、読み込み側と書き込み側の文字コードをそれぞれ指定するだけで変換できる。Windows 由来のファイルは shift_jis ではなく cp932 を指定し、newline="" を付けると CRLF の改行がそのまま残る。
HTMLの特殊文字をエスケープするには
標準の html.escape が & < > と二重引用符・単一引用符を文字参照に変換する。テキストだけに埋め込み、引用符を変換したくないときは quote=False を渡す。単一引用符は ' になり、他の言語の ' とは書き方が違うが、どちらも同じ文字を指す数値参照である。
HTTP GETリクエストを送るには
標準ライブラリの urllib.request だけで GET は送れるため、依存を増やしたくない場面ではこれで足りる。with で開くのはレスポンスのソケットを確実に閉じるため、timeout を渡すのは相手が応答しないときに無限に待たないためである。
文字列をURLエンコードするには
urllib.parse.quote は safe 引数に残したい文字を渡す仕組みで、既定の safe は "/" なので、クエリの値に使うなら safe="" を明示してスラッシュも変換する。スペースを + にする quote_plus はフォーム形式向けで、辞書をまとめて組み立てるなら urlencode を使う。
日付を書式付きの文字列にするには
strftime に書式文字列を渡すのが基本形で、f-string の書式指定でも同じ指定子が使える。機械的に読み書きするなら isoformat のほうが安全で、書式のゆらぎを持ち込まずに済む。
文字列の長さを取得するには
len は文字列に含まれるコードポイントの数を返す。バイト数が必要なときは encode してから len を取る。国旗や結合文字は見た目が 1 文字でも複数のコードポイントでできているので、len の値と見た目の文字数は一致しない。
ファイルが存在するか調べるには
Path.is_file() はパスが存在し、かつ通常のファイルであるときだけ True を返す。exists() はディレクトリでも True になるため、開くことが前提の判定には is_file() を使う。
UNIXタイムスタンプを日付に変換するには
fromtimestamp に tz=timezone.utc を渡すとタイムゾーン情報を持つ UTC の値が返り、astimezone で表示したい地域へ変換できる。tz を省くと実行環境のローカル時刻で tzinfo の無い値になり、aware な値と大小を比べたり引き算したりすると TypeError になる(== は例外にならず常に False を返す)。utcfromtimestamp は Python 3.12 で非推奨になったため、tz を渡す形に統一する。
配列に要素が含まれるか調べるには
in 演算子は要素を先頭から == で順に比べるため、中身が同じリストでも見つかる。位置が必要なときは index を使うが、無い値を渡すと ValueError になるので、先に in で確認するか例外を処理する。
現在時刻を取得するには
datetime.now() を引数なしで呼ぶと、タイムゾーン情報を持たない naive な値が返る。UTC 基準で扱うなら datetime.now(timezone.utc) のように tz を渡す。naive と aware を混ぜて比較すると TypeError になるため、どちらで統一するかを先に決めておく。
ディレクトリを作成するには
Path.mkdir は親ディレクトリが無いと FileNotFoundError になるため、parents=True を付けて途中のディレクトリまでまとめて作る。exist_ok=True を付けると既にあるときも成功になるので、何度実行しても同じ結果になる準備処理に向く。
環境変数を読むには
os.environ["KEY"] は未設定だと KeyError を投げる。落としたくないときは get や os.getenv に既定値を渡す。値は常に文字列で返るため、数値として使うなら int() で変換する。
配列をソートするには
sorted は新しいリストを返し、list.sort は元のリストをその場で並べ替える。並べ替えの基準を変えたいときは key に関数を渡し、降順にするなら reverse=True を指定する。
数値をゼロ埋めするには
f-string の書式指定 05 は、幅 5 に足りない分を先頭のゼロで埋める。文字列になっている値は str.zfill でも埋められ、どちらも符号を幅に数えたうえで符号の後ろにゼロを入れるので、-42 は -0042 になる。連番のファイル名を作るときに "img_" + i のように数値を + でつなぐと TypeError になるため、書式指定で文字列にしてからつなぐ。
数値を指定した範囲に収めるには
組み込み関数に clamp は無いので、min で上限に抑えてから max で下限に持ち上げる。max と min の組み合わせだけでは下限と上限を逆に渡してもエラーにならず下限が返るため、関数にまとめて先に大小を検査しておく。
文字列を置換するには
str.replace は元の文字列を変更せず、置換後の新しい文字列を返す。既定で全置換になるため、回数を制限したいときは第3引数 count を渡す。
数値を3桁区切りにするには
書式指定に , を付けると 3 桁ごとにカンマが入り、,.2f のように小数の桁数とも組み合わせられる。この書き方はロケールに左右されず常にカンマを使う一方、ロケールに従う n 指定は locale.setlocale を呼ばない限り区切りを入れず、format(1234567, "n") は 1234567 のままになる。文章に埋め込むときに + で数値をつなぐと TypeError になるため、f-string の中で書式を指定する。
整数の割り算で商と余りを求めるには
// が商、% が余りを返し、divmod を使うと両方を 1 回で得られる。// は商を小さい側へ切り下げるので -17 // 5 は -4 になり、余りは割る数と同じ符号の 3 になる。/ は整数どうしでも float を返すので、整数の商が欲しいときは // を使う。0 で割ると ZeroDivisionError が送出される。
小数を指定桁で丸めるには
round は第 2 引数で桁数を指定して丸めるが、ちょうど真ん中の値は偶数の側へ寄せるため round(2.5) は 2 になる。さらに 2.675 は 2 進数では 2.67499… として保持されているので、round(2.675, 2) は 2.67 を返す。金額のように見た目どおりの四捨五入が必要な値は、文字列から作った Decimal を ROUND_HALF_UP 付きの quantize で丸める。
JSONをパースするには
ファイルから読むときは json.load、既に文字列になっているときは json.loads を使う。encoding を明示するのは、既定値が環境依存で日本語が文字化けする事故を防ぐためである。
環境変数を真偽値として読むには
Python には環境変数の文字列を真偽値にする標準関数が無く、bool() で変換すると "false" や "0" も空でない文字列なので True になる。以前使われた distutils.util.strtobool は Python 3.12 で distutils ごと削除され、import すると ModuleNotFoundError になるため、受け付ける値の集合を自前で定義して比較する。
パスからファイル名を取り出すには
Path.name はパスの最後の要素を返し、拡張子を除いた名前は stem で得られる。stem が取り除くのは最後の拡張子だけなので、archive.tar.gz は archive.tar になる。os.path.basename は最後の / より後ろをそのまま返すため、data/logs/ のように末尾に / が付いたパスでは空文字になる。
ファイルに書き込むには
with 文を使うと書き込み後にファイルが自動で閉じられ、バッファのフラッシュ漏れを防げる。モード "w" は既存内容を上書きするため、末尾に足したいときは "a" を使う。
ファイルを読み込むには
with 文を使うとブロックを抜けた時点でファイルが自動的に閉じられ、クローズ漏れを防げる。encoding は環境によって既定値が変わるため明示する。
JSONをファイルに保存するには
json.dump で一時ファイルに書き、書き終えてから os.replace で本来の名前に置き換える。json.dump は変換しながら少しずつ書き込むので、途中で変換できない値に当たると書きかけのファイルが残り、本来の名前へ直接書いていると前回の正常な内容まで失うからである。encoding を省略すると日本語版 Windows では cp932 で書かれ、ほかの環境から UTF-8 として読めなくなるため明示する。
HTTPでファイルをダウンロードするには
urlopen が返すレスポンスはファイルのように読めるので、shutil.copyfileobj でバイナリモードのファイルへ少しずつ写す。urlopen は 4xx / 5xx を HTTPError として投げるため保存処理まで進まず、リダイレクトも自動で追う。一時ファイルに書いてから os.replace で置き換えるのは、途中で失敗したときに壊れたファイルが本来の名前で残らないようにするためである。
正規表現で大文字小文字を区別せずに一致させるには
re.IGNORECASE(短縮形は re.I)を関数の flags 引数か re.compile に渡すと照合全体で大文字小文字を無視する。パターン先頭に (?i) と書いても同じだが、こちらはパターン文字列だけで完結するので、フラグを渡せない API に文字列を渡すときに使える。
配列の最大値と最小値を求めるには
組み込みの max と min に配列を渡すと最大値と最小値が返る。比べる基準を変えたいときは key に関数を渡す。空の配列を渡すと ValueError になるため、空になりうる場合は default で戻り値を決めておく。
親ディレクトリのパスを取得するには
Path.parent は最後の要素を取り除いたパスを返し、2 階層以上さかのぼるときは parents[n] を使う。os.path.dirname は最後の区切り文字より前を返すだけなので、data/logs/ のように末尾に / が付いたパスではそのディレクトリ自身が返る。スクリプトと同じ場所のファイルを扱うときは、__file__ を resolve してから parent を取る。
相対パスを絶対パスにするには
resolve はカレントディレクトリを基準に絶対パスへ変換し、.. の除去とシンボリックリンクの解決まで行う。absolute は前にカレントディレクトリを付けるだけで .. を残す。相対パスはスクリプトの場所ではなく実行時のカレントディレクトリから解釈されるため、同梱ファイルを読むときは __file__ を基準にする。
ファイルの拡張子を取り出すには
Path.suffix は最後のドット以降をドット付きで返し、.tar.gz のような二重拡張子をまとめて見たいときは suffixes を使う。.bashrc のようにドットで始まるだけの名前は拡張子なしとして扱われる。拡張子で振り分けるときは、大文字小文字をそろえてから比べる。
パスを連結するには
pathlib.Path は / 演算子でつなげるので、区切り文字を文字列で書かずに済み、Windows では自動で \ になる。os.path.join も同じ規則でつなぐが戻り値が str なので、続けて拡張子や親ディレクトリを扱うなら Path のまま持つほうが扱いやすい。
日付に日数を足すには
date や datetime に timedelta を足すと、月末や年末をまたいだ繰り上がりを含めた新しい値が返る。引くときは timedelta を引けばよく、元の値は変わらない。timedelta には月や年の単位が無いため、「1 か月後」は標準ライブラリの timedelta だけでは表せない点に注意する。
ファイルをコピーするには
shutil.copy2 は中身に加えて更新時刻やパーミッションまで複製するので、バックアップ用途では copy より適している。宛先の親ディレクトリは自動では作られず、無いまま呼ぶと FileNotFoundError になるため、必要なら先に os.makedirs で用意する。
文字列を数値に変換するには
int と float はそれぞれ整数と小数へ変換し、変換できない文字列には ValueError を投げる。int は "42.0" のような小数点付きの文字列も受け付けないため、小数を含みうる入力は float を経由してから int にする。第 2 引数の基数を使うと 16 進数などの文字列も直接読める。
2つのJSONをマージするには
辞書の | 演算子は同じキーを丸ごと置き換える浅いマージなので、入れ子の一部だけを上書きすると host が消える。入れ子まで統合したいときは、両方が辞書のときだけ再帰する関数を自分で用意する。
環境変数の一覧を取得するには
os.environ は辞書と同じインターフェースを持つマッピングなので、items() や内包表記がそのまま使える。sorted で名前順にしておくと、環境ごとの差分を目で追いやすくなる。
正規表現に一致する部分をすべて取り出すには
re.findall はキャプチャグループがあるとグループだけを、無ければ一致全体を返す。同じパターンでも括弧の有無で戻り値の中身が変わるので、一致全体と位置の両方が要るときは finditer を使って Match オブジェクトのまま回す。
HTTPリクエストにタイムアウトを設定するには
urlopen の timeout はソケットの入出力が止まったままでいられる秒数であり、通信全体の所要時間の上限ではない。接続段階で時間切れになると TimeoutError は URLError に包まれて飛んでくるため、両方を捕まえておく必要がある。
正規表現で部分文字列を取り出すには
丸括弧で囲んだ部分が group(1) から順に取り出せ、group(0) は一致した全体になる。(?P<name>...) と書くと名前でも引けるようになり、番号のずれに強くなる。re.search は一致しないと None を返すので、if で受けてから group を呼ぶ。
文字列が正規表現に一致するか調べるには
re.match は先頭からの一致、re.search はどこかにあるか、re.fullmatch は全体一致をそれぞれ判定する。「含まれるか」を調べたいのに re.match を使うのがもっとも多い取り違えなので、目的に合うものを選ぶ。戻り値は Match オブジェクトか None なので、真偽値が欲しいときは bool で包む。
正規表現で置換するには
re.sub は既定で一致した箇所をすべて置き換え、count を渡すと回数を制限できる。置換文字列の中では \1 のように後方参照が使えるので、raw 文字列で書くとバックスラッシュの二重化を避けられる。関数を渡すと一致ごとに結果を組み立てられる。
2つの日付の差を求めるには
date 同士・datetime 同士を引くと timedelta が返る。date 同士なら days がそのまま日数になるが、datetime 同士の場合 days は切り捨てた日数で、24 時間未満の端数は seconds 側に入る。時間や分の単位でまとめて見たいときは total_seconds() を割るのが確実である。
文字列が含まれるか調べるには
部分文字列が含まれるかどうかは in 演算子で判定する。比較は既定で大文字小文字を区別するため、区別したくないときは casefold で畳んでから比較する。位置が必要なら find を使うが、見つからない場合は例外ではなく -1 が返る点に注意する。
配列から重複を除くには
dict はキーの挿入順を保つため、dict.fromkeys を経由すると出現順のまま重複を除ける。順序が不要なら set が最短だが、set は順序を保証しないので並びが要るときは sorted と組み合わせる。
配列を文字列に連結するには
str.join は「区切り文字」側のメソッドで、引数に渡した反復可能オブジェクトの要素を連結する。要素に数値が混じると TypeError になるため、map(str, ...) で先に文字列化しておく。
配列を条件で絞り込むには
リスト内包表記が最も読みやすく、結果はその場でリストになる。組み込みの filter はイテレータを返すため、表示したり複数回使ったりするなら list へ変換する必要がある。
ディレクトリ内のファイル一覧を取得するには
Path.iterdir() はディレクトリ直下の項目を Path として順に返す。ディレクトリも混ざるので is_file() で絞り、名前だけ欲しいときは .name を取る。返る順序は OS 任せなので、表示や比較に使うなら sorted() で明示的に並べる。
ネストしたJSONから値を取り出すには
dict.get の第 2 引数に空の dict を渡して繋ぐと、途中のキーが無くても KeyError にならずに最後の既定値まで到達する。data["server"]["http"] のように添字で辿ると、1 段でも欠けた時点で例外になる。
HTTPリクエストにヘッダーを付けるには
urllib.request.Request の headers 引数に辞書を渡すと、そのままリクエストヘッダーになる。User-Agent を明示しているのは、GitHub API が User-Agent の無いリクエストを 403 で拒否するためである。
環境変数を設定するには
os.environ への代入は裏で putenv を呼ぶため、以後に起動する子プロセスへも値が引き継がれる。値は文字列でなければならず、整数を代入すると TypeError になる。env= に辞書を渡した場合は親の環境を引き継がないので、os.environ を展開して差分だけを足すのが安全である。
.env ファイルを読み込むには
python-dotenv の load_dotenv は .env を読んで os.environ に流し込む。読み込み後の取り出し方は通常の環境変数と変わらない。既に同名の環境変数が設定されている場合はそちらが優先されるため、.env で上書きしたいときは override=True を渡す。
日付文字列を日付型にするには
strptime は第 2 引数の書式に完全一致した文字列だけを受け取り、合わなければ ValueError を投げる。ISO 8601 と分かっているなら書式を書かずに済む fromisoformat のほうが短く書ける。どちらも文字列にオフセットが含まれていなければ tzinfo は None のままなので、タイムゾーンを伴う計算をする前に aware へ揃える。
文字列の前後の空白を除去するには
str.strip は前後の空白・タブ・改行・CR をまとめて落とす。引数を渡した場合、それは前置詞や接尾辞ではなく「除去する文字の集合」として扱われるため、"banana".strip("ba") は 'nan' になる。決まった接頭辞・接尾辞だけを外したいときは removeprefix / removesuffix を使う。
HTTP POSTでJSONを送るには
標準ライブラリの urllib.request で POST を送る。data にバイト列を渡した時点でメソッドは POST になるが、意図を読み取れるように method を明示している。Content-Type を自分で付けるのは、urllib が既定で application/x-www-form-urlencoded を仮定し、受け側が JSON として解釈しないためである。
オブジェクトをJSON文字列にするには
json.dumps は既定で非 ASCII 文字を \uXXXX へエスケープするため、日本語をそのまま出したいときは ensure_ascii=False を指定する。indent を渡すと人が読める整形出力になり、省略すれば区切りの詰まった 1 行になる。