10/27(火) · 10:28
第8章 前半: ファイル、文字コード、JSON、CSV、検証
『日本語技術教科書 Vol.0』の第8章 前半。ファイル、文字コード、JSON、CSV、検証を、2 人の掛け合いで解説する。
この回を聴く
0:0010:28
音声を読み込めませんでした。記事は下で読めます。
AIこの記事は AI の Claude が書きました。
- 相対パスの基準は作業ディレクトリで、バイトと文字は別の層である。
withは閉じることを保証するが、ロールバックや永続性の保証ではない。 - JSON は型と共有の関係が往復せず、CSV には型が無い。
- 構文が読めても意味は保証されないので、スキーマで境界を検証し、欠損や時刻の扱いを決める。
教材の 8.1 節から 8.2 節まで。
教材の第 8 章が扱うのは、保存して読み直しても意味が崩れないデータの設計である。入口にあるのは、読み込めることと正しいことは別だという考えで、バイト、文字、レコード、型と制約、データベースの更新を段に分けて見る。
8.1.1 パスとファイルの所在
絶対パスはどこが起点でも変わらない位置で、相対パスは基準の場所から数えた位置である。open に相対パスを渡すと、プログラムの置き場所ではなく、プロセスが今いる作業ディレクトリが基準になる。同じコードでも起動した場所が違えば別のファイルを開きうる。
pathlib.Path はパスを構成要素ごとに扱える。ただ、作っただけではファイルはできず、存在も権限も約束されない。resolve() は実際の場所を割り出す操作である。基準のディレクトリを引数にすれば、この依存を見える形にできる。存在の確認が真でも、あとで開くときに成功するとは限らない。その間に別のプロセスが対象を変えうるからだ。
8.1.2〜8.1.3 文字コードと with
ファイルに保存されるのはバイトの列で、文字列からの変換が符号化、逆が復号である。文字コードの指定が無ければ、どんなバイトが並ぶかは決まらない。UTF-8 では「猫」が 3 バイトになる。テキストモードは復号と改行の変換をして文字列を渡し、バイナリモードはバイト列のままである。len にバイト列を渡すと、返るのはバイト数である。不正なバイトを復号すれば例外になる。
層ごとに失敗の種類が違い、文字に戻せても列の数が合うかは別の問題である。巨大なファイルを一度に読むと、バイト列、文字列、分割結果が同時にメモリに載りうる。壊れたバイトを黙って捨てる方針は取らない。
開いたファイルは、閉じるまで OS の資源を占める。閉じ忘れが重なると、開ける数が尽きたり、書いたはずの内容がまだ書かれていなかったりする。with は、正常終了でも例外でも出口の処理を呼び、ファイルならそこで閉じる。通常のファイルでは、処理中の例外が握りつぶされることもない。
教材の例では、書き込みの途中で例外を起こしても、with を出た時点でファイルは閉じ、途中までの内容が残る。途中の内容が残ることからも、with は自動で巻き戻すものではないと分かる。閉じて中身を送り出しても、その先にOSの蓄えや記憶装置の事情があり、電源が落ちても残る永続性とは同じではない。flush は Python のバッファを送り、fsync は OS に同期を求めるが、確かさは機器しだいで変わる。成功した結果だけを見せる書き方は、8.4.3 で扱われる。
8.2.1〜8.2.2 JSON と CSV
JSON は、オブジェクト、配列、文字列、数、真偽、null を組み合わせる交換形式で、名前に当たるキーはいつも文字列である。Python の dict は object、list と tuple は array、None は null に対応するが、型や共有の関係は往復しない。tuple を含む入力を文字列にして読み戻すと list になる。同じキーが重複すると、標準のデコーダでは後の値が残る。
標準の json は、NaN や無限大を既定で許す拡張を持つが、これらは JSON の数ではない。厳密に出力すると NaN は例外になる。入力側で拒否したい場合は方針を明示し、重複キーを禁じたいなら同名を検査する仕掛けを足す。loads が通ったことは、中身が妥当な証拠にならない。受け取る側が正確に扱える整数の範囲を越える ID は、丸められうるので、文字列で渡す対策がある。共有していた同じリストは、読み戻すと別々のリストになり、循環参照はそのままでは表せない。dump を続けて書いても 1 つの文書にはならないので、巨大なデータでは区切りの約束を別に決める。
CSV は、値の中にカンマや改行を入れたいとき、全体を引用で囲む。このため、行をカンマで割るだけの処理は、一般の CSV の解析にならない。改行を含む 1 つのレコードは複数の物理行を使い、実ファイルでは newline="" を指定して、改行が二重に変換されるのを避ける。CSV に型は無く、先頭が 0 の ID は文字列で、空のフィールドが空文字、未測定、NULL のどれかも決まらない。辞書として読むと、短い行の足りない列に None が入り、列数の不一致を自動では拒否しない。
8.2.3 スキーマと検証
スキーマは、列の名前、型、必須かどうか、値の範囲、関係を決めた約束事で、構文を読んだだけでは守られない。教材の例では、列の集合が一致するか、ID が空白だけでないか、件数が ASCII の数字だけかを確かめ、変換するのはその後である。実運用では桁数の上限も設ける。isinstance(value, int) は真偽値にも真になるので、件数に True を許さないなら型そのものを調べる。欠損を無条件に 0 へ直すと、未測定と実際の 0 が混ざる。
時差の無い現地時刻だけでは、どの地域のどの時期かが決まらない。時差付きの瞬間を UTC に統一するか、元の時差や地域名を残す。ID の空白を除いたり大文字小文字をそろえたりすると、別々の ID が同じに見えてしまうことがある。採用の規則、重複キー、エラーの位置と理由を記録し、不正なレコードは隔離する。
後半は、関係データベースと、パイプラインの作り方へ進む。
出典
- オーナー(AI で作った教材、Web には公開していない) 日本語技術教科書 Vol.0 コンピュータからPython・機械学習・LLMへ 第8章 2026-10-18




