データフォーマットとインターネット上のデータの要点
内容の確認日: 2026-10-04
この分野は『Python実践レシピ』の第 13 章 (特定のデータフォーマットを扱う・2 問) と第 14 章 (インターネット上のデータを扱う・2 問) に対応します。PyYAML・Requests などサードパーティのライブラリの節は出題範囲外で、標準ライブラリが中心です。
CSV・JSON・TOML の読み書きと、URL の分解・組み立ては、どれも「値の型がどうなるか」(文字列のままか、数値になるか、リストになるか) がよく問われます。
CSV (csv)
csv.reader は各行を文字列のリストで、csv.DictReader は 1 行目を見出しとして、各行を辞書で返します。値はすべて文字列なので、数値として使うときは変換します。ダブルクォートで囲まれた値の中のカンマや改行は、区切りとみなされません。
csv.writer は、カンマやダブルクォートを含む値を自動でダブルクォートで囲み、中のダブルクォートは "" と 2 つ重ねます。既定の行末は \r\n です。ファイルを開くときは、改行の変換が二重にならないよう open(..., newline="") とするのが決まりです。区切り文字は delimiter で変えられます (TSV なら "\t")。
import csvimport iosrc = io.StringIO('name,price\n"Pen, blue",120\nNote,300\n')rows = list(csv.DictReader(src))print(rows[0])print(sum(int(r["price"]) for r in rows))out = io.StringIO()writer = csv.DictWriter(out, fieldnames=["name", "memo"])writer.writeheader()writer.writerow({"name": "ann", "memo": 'say "hi"'})print(repr(out.getvalue()))python3 main.py {'name': 'Pen, blue', 'price': '120'} 420 'name,memo\r\nann,"say ""hi"""\r\n'
JSON (json)
json.dumps (文字列へ)・json.dump (ファイルへ) は Python のオブジェクトを JSON に、json.loads・json.load は JSON を Python のオブジェクトに変換します。末尾に s が付くほうが文字列を扱います。
・変換: dict ↔ オブジェクト、list・tuple → 配列 (読み込むと list)、True・False・None ↔ true・false・null
・オブジェクトのキーは文字列だけなので、整数のキーは文字列になる
・ensure_ascii=False: 日本語などをエスケープせずに出力する (既定では \uXXXX)
・indent: 整形して出力。sort_keys=True: キーを並べ替え。separators=(",", ":"): 空白なしで出力
・default=関数: datetime や set など、そのままでは変換できない値の変換方法を指定する (指定しないと TypeError)
・object_hook=関数: 読み込んだオブジェクト (辞書) を変換する
import jsonfrom datetime import datedata = {"name": "佐藤", "tags": ("a", "b"), "active": True, 1: None}print(json.dumps(data))print(json.dumps(data, ensure_ascii=False))print(json.loads(json.dumps(data)))print(json.dumps({"day": date(2026, 12, 1)}, default=str))try: json.dumps({"ids": {1, 2}})except TypeError: print("set は変換できない")python3 main.py {"name": "\u4f50\u85e4", "tags": ["a", "b"], "active": true, "1": null} {"name": "佐藤", "tags": ["a", "b"], "active": true, "1": null} {'name': '佐藤', 'tags': ['a', 'b'], 'active': True, '1': None} {"day": "2026-12-01"} set は変換できない
TOML (tomllib)
tomllib (Python 3.11 以降) は、pyproject.toml などの TOML 形式の設定ファイルを読み込むモジュールです。[テーブル] は入れ子の辞書になり、整数・文字列・真偽値・配列・日時などは TOML の書き方どおりの型に変換されます。
ファイルから読むときは、tomllib.load にバイナリモード ("rb") で開いたファイルを渡します (テキストモードだと TypeError)。文字列からは tomllib.loads で読みます。tomllib は読み込み専用で、書き出す関数はありません。
import tomllibconfig = tomllib.loads("""[project]name = "demo"version = "1.0"[tool.ruff]line-length = 88select = ["E", "F"]""")print(config["project"]["name"], config["tool"]["ruff"]["line-length"] + 12)print(config["tool"]["ruff"]["select"], hasattr(tomllib, "dumps"))python3 main.py demo 100 ['E', 'F'] False
URL の操作 (urllib.parse・urllib.request)
urllib.parse は URL の文字列を扱うモジュールです。
・urlparse・urlsplit: URL を scheme・netloc・path・query・fragment などに分解する。hostname・port (整数) も取り出せる
・parse_qs: クエリを辞書に。同じキーが複数あるので、値は常にリスト。parse_qsl は (キー, 値) のリストで順序と重複を保つ
・urlencode: 辞書をクエリ文字列に (空白は +)
・quote・unquote: %XX 形式への変換と、その逆 (空白は %20、/ は既定で変換しない)
・urljoin: 基準の URL と相対 URL から絶対 URL を作る
from urllib.parse import urlparse, parse_qs, urlencode, quote, urljoinu = urlparse("https://example.com:8080/search?q=python&lang=ja&q=3#top")print(u.scheme, u.hostname, u.port, u.path, u.fragment)print(parse_qs(u.query))print(urlencode({"q": "python 3", "page": 2}), quote("資料/a b"))base = "https://example.com/docs/guide/index.html"print(urljoin(base, "setup.html"), urljoin(base, "/about"), urljoin(base, "../api/"))python3 main.py https example.com 8080 /search top {'q': ['python', '3'], 'lang': ['ja']} q=python+3&page=2 %E8%B3%87%E6%96%99/a%20b https://example.com/docs/guide/setup.html https://example.com/about https://example.com/docs/api/
urllib.request.urlopen(URL) は URL を開き、レスポンスをファイルのように読めるオブジェクトを返します。read() で得られるのは bytes なので、decode("utf-8") で文字列にします。ヘッダーを付けるときは Request(URL, headers={...}) を作って渡し、timeout も指定しておくのが安全です。
Base64 (base64)
base64.b64encode はバイト列を Base64 でエンコードし、b64decode で元に戻します。引数も戻り値も bytes なので、文字列は encode() してから渡し、結果を文字列にするには decode() します。
Base64 は 3 バイトを 4 文字に変換し、足りない分は = で埋めます。標準の Base64 は + と / を使いますが、URL やファイル名に使う場合は、- と _ を使う urlsafe_b64encode を使います。
import base64print(base64.b64encode(b"a"), base64.b64encode(b"ab"), base64.b64encode(b"abc"))token = base64.b64encode("日本".encode()).decode()print(token, base64.b64decode(token).decode())print(base64.b64encode(b"\xfb\xff"), base64.urlsafe_b64encode(b"\xfb\xff"))python3 main.py b'YQ==' b'YWI=' b'YWJj' 5pel5pys 日本 b'+/8=' b'-_8='
試験でよくある引っかけ
CSV の値は文字列
csv.reader・csv.DictReaderで読んだ値はすべて文字列です。足し算すると連結になります。JSON の整数のキー
JSON のキーは文字列だけなので、
{1: "a"}は読み戻すと{'1': 'a'}になります。JSON にできない型
setやdatetimeはTypeErrorです。defaultで変換方法を指定します。tomllib.loadはバイナリモードファイルは
open(path, "rb")で開いて渡します。tomllibには書き出しの関数がありません。parse_qsの値はリストキーが 1 回しか出てこなくても、値は
['ja']のようにリストです。urlencodeとquoteの空白urlencodeは空白を+に、quoteは%20にします。Base64 は
bytesを扱うb64encodeに文字列を渡すとTypeErrorです。
問題で確認する
この分野の問題を、解説つきで読めます (登録不要)。
出典・参考
- Python エンジニア育成推進協会「Python 実践試験」(出題範囲)
- Python ドキュメント「csv」
- Python ドキュメント「json」
- Python ドキュメント「tomllib」
- Python ドキュメント「urllib.parse」
- Python ドキュメント「base64」
コード例は、実際に実行して結果を確認しています。