Kodrill

データフォーマットとインターネット上のデータ

Python 3 エンジニア認定実践試験

csv・json・tomllib・urllib.parse・urllib.request・base64

問題数
12 問
合格ライン
70%
実行して確認済み
9 問
この分野の要点を読む6 章・約 11 分。実行して確かめたコード例と、試験でよくある引っかけをまとめています

ログインなしで試す

無料の 5 問を、1問ごとに正誤と解説を見ながら解けます。解答は保存されません。

5 問を試す

無料登録して学習を記録する

学習履歴・ダッシュボード・ブックマーク・模試モードが使えます。

★ 残り 7 問はプレミアム会員限定です

無料プランでは先頭 5 問まで解けます。プレミアムなら全問題・苦手問題の復習・広告非表示が使えます。
料金プランを見る

問題と解説を見る (無料)

登録しなくても、次の5問は問題文と解説をそのまま読めます。

データフォーマットとインターネット上のデータの要点

内容の確認日: 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")。

Python
import csvimport io​src = 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=関数: 読み込んだオブジェクト (辞書) を変換する

Python
import jsonfrom datetime import date​data = {"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 は読み込み専用で、書き出す関数はありません。

Python
import tomllib​config = 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 を作る

Python
from urllib.parse import urlparse, parse_qs, urlencode, quote, urljoin​u = 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 を使います。

Python
import base64​print(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 です。

問題で確認する

この分野の問題を、解説つきで読めます (登録不要)。

出典・参考

コード例は、実際に実行して結果を確認しています。