🐿 こども経済新聞 18歳までに読む本声で覚える英語英語の試験ガイド
段階
0 / 14 ステップ

まず、全体の地図

どこまで行けば「実務で使える」のかを先に知っておく

プログラミングの学習でいちばん多い挫折は、「文法をひととおり覚えたけれど、何も作れない」という状態です。 これは、文法の本が基礎までしか扱っていないために起こります。 実際の仕事で使うのは、その先にある「エラーを自分で直す力」「他人のライブラリを読む力」「他人と共同で開発する作法」です。 このページは、その先までを4つの段階に分けて並べています。

段階ステップ身につくこと目安この段階を終えると
準備 STEP 0 Pythonの導入、VS Codeの使い方、実行のしかた 1〜3日 自分のパソコンでプログラムを動かせる
基礎 STEP 1〜4 変数と型、条件分岐、くり返し、リストと辞書、関数 3〜6週間 小さな計算プログラムを自力で書ける
応用 STEP 5〜8 エラー処理、ファイル・CSV・JSON、外部ライブラリ、クラス 4〜8週間 人のコードを読め、ライブラリを調べて使える
実務 STEP 9〜13 業務自動化、データ集計、Web API、Git・テスト・仮想環境 2〜4か月 仕事の作業を自分で置きかえられる

※ 目安は1日1時間ほど学習した場合です。学習速度には大きな個人差があります。期間より、手を動かした量のほうが結果に効きます。

目次(クリックでジャンプ)

14ステップの学習ロードマップ

STEP 0 準備

パソコンにPythonを入れて、1行動かす

目安 1〜3日
このステップの到達点 ── 自分のパソコンで python が動き、書いたファイルを実行して結果が画面に出る。ここでつまずく人はとても多いので、あせらず1つずつ確認してください。

Pythonとは何か

Pythonは、人が読みやすいことを重視して作られたプログラミング言語です。同じ処理を書くのに他の言語より行数が少なくて済み、英語の文章に近い見た目になります。世界的にもっとも利用者が多い言語のひとつで、データ分析・業務自動化・Webサービス・AIのすべてで使われています。事務作業の自動化から機械学習まで、1つの言語で幅広くカバーできるのが最大の利点です。

1. Pythonを入れる

Windows ── 公式サイト python.org の「Downloads」から最新版のインストーラーをダウンロードします。実行したら、最初の画面にある 「Add python.exe to PATH」に必ずチェックを入れて から「Install Now」を押してください。ここを忘れると、後で python と打っても「見つかりません」と言われます。

Mac ── 最初からPythonが入っていますが、それは古い版でシステム用のものです。学習には別途、公式サイトから最新版を入れるか、brew install python で入れます。Macでは python3pip3 のように、末尾に「3」を付けて呼ぶのが基本です。

2. きちんと入ったか確かめる

Windowsは「PowerShell」、Macは「ターミナル」を開いて、次を打ちます。これらは、パソコンに文字で命令を出すための道具です。

ターミナル / PowerShell
python --version
# Macでうまくいかないときは
python3 --version
実行結果(例)
Python 3.13.1

このようにバージョンが表示されれば成功です。数字は違っていてかまいません。

3. エディタ(VS Code)を入れる

プログラムを書くための専用ソフトをエディタといいます。定番は無料の Visual Studio Code(VS Code)です。入れたら、左側の四角が並んだアイコン(拡張機能)から「Japanese Language Pack」(日本語化)と「Python」の2つを追加してください。これでコードに色が付き、まちがいをその場で指摘してくれるようになります。

4. はじめてのプログラム

デスクトップに python-study という名前のフォルダを作り、VS Codeでそのフォルダを開きます(メニューの「ファイル → フォルダーを開く」)。そこに hello.py というファイルを新しく作り、次の1行を書いて保存します。

hello.py
print("Hello, Python!")

保存したら、VS Codeの右上にある「▷(実行)」ボタンを押します。画面の下に結果が出ます。

実行結果
Hello, Python!

print() は「かっこの中身を画面に表示せよ」という命令です。この1行が出れば、準備はすべて完了です。

拡張子を表示させておく Windowsの初期設定では .py などの拡張子が隠れており、hello.py.txt という名前になってしまう事故が起こります。エクスプローラーの「表示」から「ファイル名拡張子」にチェックを入れておいてください。
フォルダ名に注意 日本語や空白を含むフォルダ(「新しいフォルダー」など)や、OneDrive・iCloudの同期フォルダの中は、後々トラブルの原因になります。学習用のフォルダは半角英数字だけの名前で、同期のかからない場所に作るのが安全です。
練習問題

自分の名前と、今の意気込みを2行に分けて表示するプログラムを書いてください。

解答を見る
answer.py
print("うえき たかゆき")
print("3か月でPythonを仕事に使う")

print() は1回で1行です。行を増やしたいときは print() を並べます。

STEP 1 基礎

変数と型 ── データを箱に入れて扱う

目安 1週間
このステップの到達点 ── 数値と文字列の違いを理解し、計算結果を変数に入れて表示できる。TypeError の意味がわかる。

変数は「名前の付いた箱」

プログラムでは、あとで使う値に名前を付けて取っておきます。これを変数といいます。= は「等しい」ではなく「右の値を左の名前に入れる」という意味です。

variables.py
price = 120        # 整数(int)
tax_rate = 0.1     # 小数(float)
name = "りんご"     # 文字列(str)
is_sale = True     # 真偽値(bool)

total = price * (1 + tax_rate)
print(name, "の税込価格は", total, "円です")
実行結果
りんご の税込価格は 132.0 円です

4つの基本の型

書き方意味できること
int10整数四則演算。個数、回数、年など
float3.14小数四則演算。金額の割合、平均など
str"あいう"文字列つなぐ、切り出す、置きかえる
boolTrue / False真偽値条件が成り立つかどうかの判定

f文字列 ── 実務で最もよく使う書き方

文字列の前に f を付けると、{ } の中に変数や計算式をそのまま埋め込めます。読みやすく、実務ではこの書き方が標準です。

fstring.py
name = "みかん"
price = 980
count = 3

print(f"{name}を{count}個買うと{price * count}円です")

# 桁区切りや小数点の桁数も指定できる
total = price * count
print(f"合計: {total:,} 円")        # 3桁ごとにカンマ
print(f"平均: {total / 7:.2f} 円")  # 小数第2位まで
実行結果
みかんを3個買うと2940円です
合計: 2,940 円
平均: 420.00 円

型が違うとエラーになる

初心者が最初にぶつかる壁がこれです。数字に見えても文字列ということがよくあります。

type_error.py
age = input("年齢を入力してください: ")   # input はいつも「文字列」を返す
print(type(age))

# print(age + 1)   # これは TypeError になる
print(int(age) + 1)  # int() で数値に変換してから計算する
実行結果(20と入力した場合)
<class 'str'>
21
TypeError の読み方 TypeError: can only concatenate str (not "int") to str は「文字列に数値はつなげられない」という意味です。int()str() で型をそろえれば直ります。type(変数) で型を確かめる癖をつけてください。

変数の名前の付け方

  • すべて小文字、単語の区切りは _(アンダースコア)── total_priceuser_name
  • 中身がわかる名前を付ける。adata1 は3日後の自分が読めません
  • 日本語も使えますが、実務では使いません。英単語で付けます
  • liststrsum などPythonがすでに使っている名前は避ける
練習問題

身長(cm)と体重(kg)を変数に入れ、BMI(体重 ÷ 身長(m)の2乗)を小数第1位まで表示してください。

解答を見る
bmi.py
height_cm = 170
weight_kg = 62.5

height_m = height_cm / 100
bmi = weight_kg / (height_m ** 2)   # ** は「累乗」

print(f"BMIは {bmi:.1f} です")
実行結果
BMIは 21.6 です
STEP 2 基礎

条件分岐とくり返し ── プログラムに判断させる

目安 1週間
このステップの到達点 ── if で場合分けし、for で同じ処理をくり返せる。字下げ(インデント)の意味がわかる。

if文 ── もし〜なら

条件が成り立つときだけ実行する、という書き方です。行の終わりの コロン(:) と、次の行の半角スペース4つの字下げが必須です。Pythonでは字下げが「ここからここまでが一つのまとまり」を表します。

if_basic.py
score = 78

if score >= 80:
    print("よくできました")
elif score >= 60:
    print("合格です")
else:
    print("もう一度がんばりましょう")

print("判定おわり")   # 字下げしていないので、必ず実行される
実行結果
合格です
判定おわり

条件の書き方

記号意味
==等しい(=は「代入」なので別物)if name == "田中":
!=等しくないif status != "完了":
> >=より大きい/以上if age >= 18:
andかつ(両方成り立つ)if age >= 18 and has_id:
orまたは(どちらか成り立つ)if day == "土" or day == "日":
not〜でないif not is_member:
in含まれているif "エラー" in message:

for文 ── くり返す

同じ処理を何度も書かずに済ませるのがくり返しです。これが書けるようになると、プログラムを書く価値が一気に上がります。

for_basic.py
fruits = ["りんご", "みかん", "ぶどう"]

for fruit in fruits:
    print(f"{fruit}を数えました")

# 回数を指定してくり返す
for i in range(3):        # 0, 1, 2 の3回
    print(f"{i + 1}回目")

# 番号と中身を同時に取り出す(実務で頻出)
for index, fruit in enumerate(fruits, start=1):
    print(f"{index}: {fruit}")
実行結果
りんごを数えました
みかんを数えました
ぶどうを数えました
1回目
2回目
3回目
1: りんご
2: みかん
3: ぶどう

while文と、途中で抜ける

while_basic.py
total = 0
for price in [500, 1200, 800, 3000, 400]:
    if price >= 3000:
        print("高額なので集計から外します")
        continue          # この回だけ飛ばして次へ
    total += price        # total = total + price と同じ
    if total > 2000:
        print("2000円を超えたので終了します")
        break             # くり返しそのものを抜ける

print(f"合計: {total}円")
実行結果
2000円を超えたので終了します
合計: 2500円
無限ループに注意 while は条件が False になるまで永久に回り続けます。止まらなくなったら、ターミナルで Ctrl + C を押して強制終了してください。慣れないうちは for を使うほうが安全です。
字下げは半角スペース4つ Tabキーと半角スペースを混ぜると IndentationErrorTabError になります。VS Codeは初期設定でTabキーがスペース4つに変換されるので、そのまま使えば問題ありません。
練習問題

1から100までの整数のうち、3の倍数だけを合計して表示してください。

解答を見る
multiple3.py
total = 0
for i in range(1, 101):     # 1から100まで(101は含まれない)
    if i % 3 == 0:          # % は「割った余り」
        total += i

print(f"3の倍数の合計は {total} です")
実行結果
3の倍数の合計は 1683 です
STEP 3 基礎

リストと辞書 ── たくさんのデータをまとめて扱う

目安 1〜2週間
このステップの到達点 ── リストと辞書を使い分けられる。表形式のデータを「辞書のリスト」で表現し、集計できる。

リスト ── 順番のある入れ物

list_basic.py
sales = [1200, 980, 3400, 760, 2100]

print(sales[0])       # 最初の要素(番号は0から始まる)
print(sales[-1])      # 最後の要素
print(sales[1:3])     # 1番目から3番目の手前まで(スライス)
print(len(sales))     # 要素の数
print(sum(sales))     # 合計
print(max(sales))     # 最大値
print(sorted(sales, reverse=True))   # 大きい順に並べる

sales.append(1500)    # 末尾に追加
sales.remove(760)     # 値を指定して削除
print(sales)
実行結果
1200
2100
[980, 3400]
5
8440
3400
[3400, 2100, 1200, 980, 760]
[1200, 980, 3400, 2100, 1500]

辞書 ── 名前で取り出す入れ物

「キー(名前)」と「値」の組で管理します。実務では、CSVの1行やAPIの返答が、そのまま辞書の形で届きます。

dict_basic.py
user = {"name": "田中", "age": 28, "dept": "営業部"}

print(user["name"])
print(user.get("email", "未登録"))   # キーが無くてもエラーにならない書き方

user["age"] = 29          # 上書き
user["email"] = "tanaka@example.com"   # 追加

for key, value in user.items():
    print(f"{key}: {value}")
実行結果
田中
未登録
name: 田中
age: 29
dept: 営業部
email: tanaka@example.com
[ ].get() の使い分け user["email"] はキーが無いと KeyError で止まります。無いかもしれないキーは .get() を使い、初期値を渡しておくと安全です。実務のデータは「あるはずの項目が空」ということが日常的に起こります。

実務で最も多い形 ── 辞書のリスト

表のデータは、次のように「1行=1つの辞書」で表します。この形に慣れると、CSVでもデータベースでもAPIでも同じ考え方で扱えます。

records.py
orders = [
    {"item": "ノートPC", "price": 128000, "count": 2, "dept": "営業部"},
    {"item": "マウス",   "price": 2800,   "count": 10, "dept": "営業部"},
    {"item": "モニター", "price": 32000,  "count": 4, "dept": "開発部"},
]

# 全体の売上
total = 0
for order in orders:
    total += order["price"] * order["count"]
print(f"総額: {total:,}円")

# 部署ごとに集計する
by_dept = {}
for order in orders:
    dept = order["dept"]
    amount = order["price"] * order["count"]
    by_dept[dept] = by_dept.get(dept, 0) + amount

for dept, amount in by_dept.items():
    print(f"{dept}: {amount:,}円")
実行結果
総額: 412,000円
営業部: 284,000円
開発部: 128,000円

内包表記 ── 1行で作る

リストから新しいリストを作るとき、Pythonでは1行で書けます。実務のコードには当たり前に出てくるので、読めるようにしておいてください。

comprehension.py
prices = [1200, 980, 3400, 760, 2100]

# 普通に書くと3行
taxed = []
for p in prices:
    taxed.append(int(p * 1.1))

# 内包表記なら1行
taxed = [int(p * 1.1) for p in prices]
print(taxed)

# 条件をつけて絞り込む
expensive = [p for p in prices if p >= 2000]
print(expensive)
実行結果
[1320, 1078, 3740, 836, 2310]
[3400, 2100]
そのほかの入れ物(タプル・集合)も見る

タプル(tuple)── あとから変えられないリスト

point = (35.68, 139.76) のように丸かっこで書きます。中身を書きかえられないので、緯度経度や設定値など「変わっては困るもの」に使います。関数が複数の値を返すときも、実体はタプルです。

集合(set)── 重複のない入れ物

set(["A", "B", "A"]){'A', 'B'} になります。重複を消したいとき、2つのリストの共通部分を求めたいときに便利です。list(set(items)) は実務で頻繁に使う重複除去の書き方です。

練習問題

上の orders から、金額(price × count)が10万円以上の商品名だけをリストにして表示してください。

解答を見る
answer.py
big = [o["item"] for o in orders if o["price"] * o["count"] >= 100000]
print(big)
実行結果
['ノートPC', 'モニター']
STEP 4 基礎

関数 ── 処理に名前を付けて、使い回す

目安 1〜2週間
このステップの到達点 ── 自分で関数を作り、引数と戻り値を正しく設計できる。型ヒントとdocstringを書ける。

関数の作り方

同じ処理を何度も書くのをやめ、名前を付けてまとめたものが関数です。プログラムが長くなるほど価値が出ます。

function_basic.py
def calc_tax_included(price, rate=0.1):
    """税込価格を計算して返す。

    price: 税抜価格
    rate:  税率(省略すると0.1)
    """
    return int(price * (1 + rate))


print(calc_tax_included(1000))            # 1100
print(calc_tax_included(1000, 0.08))      # 1080
print(calc_tax_included(price=1000, rate=0.2))   # 名前で渡すこともできる
実行結果
1100
1080
1200
  • 引数 ── 関数に渡す材料。rate=0.1 のように既定値を決めておける
  • 戻り値 ── return で呼び出し元に返す結果。return を書かない関数は None を返す
  • docstring ── """〜""" で書く説明文。何をする関数かを必ず書く

型ヒント ── 実務では書くのが当たり前

引数と戻り値がどんな型かを注記できます。動作は変わりませんが、VS Codeが間違いを指摘してくれるようになり、他人(と未来の自分)が読みやすくなります。チーム開発では必須と考えてください。

type_hint.py
def calc_tax_included(price: int, rate: float = 0.1) -> int:
    """税込価格を計算して返す。"""
    return int(price * (1 + rate))


def summarize(orders: list[dict]) -> dict[str, int]:
    """部署ごとの売上を集計して返す。"""
    result: dict[str, int] = {}
    for order in orders:
        amount = order["price"] * order["count"]
        result[order["dept"]] = result.get(order["dept"], 0) + amount
    return result

良い関数の3つの条件

  1. 1つのことだけをする ── 「読み込んで、集計して、保存する」は3つの関数に分ける
  2. 名前で中身がわかる ── calc_tax_included() は良い名前、shori() は悪い名前。動詞で始めるのが基本
  3. 外の変数に頼らない ── 必要なものは引数で受け取り、結果は return で返す。そうすればどこでも再利用でき、テストも書ける
スコープ(有効範囲) 関数の中で作った変数は、その関数の中でしか見えません。逆に、関数の外の変数を関数の中から書きかえるのは(可能ですが)事故のもとです。関数は「入口=引数、出口=戻り値」だけでやり取りすると考えてください。

実際に使う形にまとめる

main_pattern.py
def load_orders() -> list[dict]:
    """注文データを用意する(後でCSV読み込みに差し替える)。"""
    return [
        {"item": "ノートPC", "price": 128000, "count": 2, "dept": "営業部"},
        {"item": "モニター", "price": 32000, "count": 4, "dept": "開発部"},
    ]


def summarize(orders: list[dict]) -> dict[str, int]:
    result: dict[str, int] = {}
    for o in orders:
        result[o["dept"]] = result.get(o["dept"], 0) + o["price"] * o["count"]
    return result


def main() -> None:
    orders = load_orders()
    for dept, amount in summarize(orders).items():
        print(f"{dept}: {amount:,}円")


if __name__ == "__main__":
    main()
if __name__ == "__main__": とは 「このファイルが直接実行されたときだけ、下の処理を動かす」という意味です。他のファイルから import して部品として使われたときには動きません。実務のPythonファイルにはほぼ必ず出てくる決まり文句なので、そのまま覚えてしまってください。
練習問題

点数のリストを受け取り、平均点を小数第1位まで四捨五入して返す関数 average() を作ってください。リストが空のときは0を返すようにします。

解答を見る
average.py
def average(scores: list[int]) -> float:
    """点数の平均を返す。空のときは0.0を返す。"""
    if not scores:          # 空のリストは False として扱われる
        return 0.0
    return round(sum(scores) / len(scores), 1)


print(average([80, 95, 72, 68]))
print(average([]))
実行結果
78.8
0.0

※ 空のリストを渡すと len() が0になり、割り算で ZeroDivisionError が起きます。こうした「例外的な入力」を先に処理しておくのが実務の作法です。

STEP 5 応用

エラーとデバッグ ── 自力で直せる人になる

目安 1週間
このステップの到達点 ── エラーメッセージを読んで原因の行を特定できる。try / except で想定内の失敗に備えられる。ここが初心者と実務者を分ける最大の分岐点です。

エラーは「敵」ではなく「行き先の案内」

赤い文字が出ると怖く感じますが、Pythonのエラーはどこで何が起きたかを正確に教えてくれる案内文です。読まずに閉じてしまう人はいつまでも上達しません。読み方には決まった順番があります。

ターミナルに出るエラー(トレースバック)
Traceback (most recent call last):
  File "/Users/you/python-study/main.py", line 12, in <module>
    total = calc(price, count)
  File "/Users/you/python-study/main.py", line 6, in calc
    return price * count + tax
NameError: name 'tax' is not defined
  1. いちばん下の行を最初に読む ── エラーの種類(NameError)と理由(tax が定義されていない)が書いてあります
  2. 次に、下から2番目のFile行 ── main.py6行目が実際に落ちた場所です
  3. 上の行ほど「そこに至るまでの経路」です。自分の書いたファイル名が出ている、いちばん下の行を見ます

よく出るエラーと原因

エラー名意味よくある原因
SyntaxError文法が壊れているコロン抜け、かっこや引用符の閉じ忘れ
IndentationError字下げが正しくないスペースの数がそろっていない、Tabとの混在
NameErrorその名前が存在しない変数名のつづり間違い、定義前に使っている
TypeError型が合わない文字列と数値の足し算、引数の数が違う
ValueError型は合うが中身が不正int("abc") のような変換の失敗
IndexErrorリストの範囲外3個しかないのに list[3] を見た
KeyError辞書にそのキーが無い項目名のつづり違い、データの欠損
FileNotFoundErrorファイルが見つからないパスの間違い、実行場所の勘違い
ModuleNotFoundErrorライブラリが無いpip install 忘れ、仮想環境の入れ違い
ZeroDivisionError0で割った件数0で平均を出そうとした

try / except ── 失敗を想定して受け止める

「起きるかもしれない失敗」は、あらかじめ受け止め方を書いておきます。ファイルの読み込みや外部との通信など、自分の力ではどうにもならない部分に使うのが原則です。

try_except.py
def to_int(text: str) -> int | None:
    """文字列を数値に変換する。できなければNoneを返す。"""
    try:
        return int(text)
    except ValueError:
        print(f"『{text}』は数値に変換できません")
        return None


print(to_int("120"))
print(to_int("百二十"))

# ファイル読み込みでの典型的な書き方
try:
    with open("data.csv", encoding="utf-8") as f:
        text = f.read()
except FileNotFoundError:
    print("data.csv が見つかりません。パスを確認してください")
else:
    print(f"{len(text)}文字を読み込みました")   # 成功したときだけ動く
finally:
    print("処理を終了します")                   # 成否によらず必ず動く
実行結果(data.csvが無い場合)
120
『百二十』は数値に変換できません
None
data.csv が見つかりません。パスを確認してください
処理を終了します
やってはいけない書き方 except:except Exception: pass のように、すべての失敗を握りつぶす書き方は絶対に避けてください。バグが表に出なくなり、原因究明が不可能になります。受け止めるのは予期している種類のエラーだけです。

デバッグの手順

  1. エラーの最下行を読む ── 種類と理由を確認する
  2. 落ちた行の直前で print() する ── print(type(x), x) で「思っていた中身か」を確かめる。原因の8割はここで判明します
  3. 入力を最小にする ── 1000行のCSVで悩まず、3行に減らして試す
  4. エラー文をそのまま検索する ── ファイル名など自分の環境固有の部分は削り、英語のメッセージだけを検索します
  5. それでもだめなら人(かAI)に聞く ── そのとき、やりたいこと・書いたコード・エラー全文の3点セットを必ず添えます
VS Codeのデバッガ 行番号の左をクリックすると赤い丸(ブレークポイント)が置けます。その状態でF5キーを押すと、その行で実行が止まり、そのときの全変数の中身を一覧できます。print() を大量に足すより速いので、慣れてきたらぜひ使ってください。
STEP 6 応用

ファイル操作 ── CSVとJSONを読み書きする

目安 1週間
このステップの到達点 ── CSVを読み込んで集計し、結果を別ファイルに書き出せる。文字コードとパスの扱いがわかる。

ファイルを開く基本形

with を使うと、処理が終わったときに自動で閉じてくれます。実務ではこの書き方以外はしません。日本語を扱うので encoding="utf-8" の指定も必須です。

file_basic.py
# 書き込む("w"は新規作成・上書き、"a"は追記)
with open("memo.txt", "w", encoding="utf-8") as f:
    f.write("1行目\n")
    f.write("2行目\n")

# 読み込む
with open("memo.txt", encoding="utf-8") as f:
    for line in f:
        print(line.rstrip())   # 行末の改行を取り除く
実行結果
1行目
2行目

CSVを読む ── 実務で最も出番が多い

csv.DictReader を使うと、1行が「見出しをキーにした辞書」として取れます。STEP 3で練習した「辞書のリスト」がそのまま使えます。

sales.csv
date,item,price,count,dept
2026-08-01,ノートPC,128000,2,営業部
2026-08-01,マウス,2800,10,営業部
2026-08-02,モニター,32000,4,開発部
2026-08-03,キーボード,8600,6,開発部
read_csv.py
import csv
from collections import defaultdict

by_dept = defaultdict(int)   # 初期値0の辞書。get()を書かなくてよい

with open("sales.csv", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        # CSVから読んだ値はすべて文字列なので、数値に変換する
        amount = int(row["price"]) * int(row["count"])
        by_dept[row["dept"]] += amount

for dept, amount in sorted(by_dept.items(), key=lambda x: x[1], reverse=True):
    print(f"{dept}: {amount:,}円")
実行結果
営業部: 284,000円
開発部: 179,600円

CSVに書き出す

write_csv.py
import csv

rows = [
    {"dept": "営業部", "amount": 284000},
    {"dept": "開発部", "amount": 179600},
]

# newline="" を付けないとWindowsで空行が入る
with open("summary.csv", "w", encoding="utf-8-sig", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=["dept", "amount"])
    writer.writeheader()
    writer.writerows(rows)

print("summary.csv を書き出しました")
Excelで開くなら utf-8-sig 書き出しに utf-8 を使うと、Excelで開いたとき日本語が文字化けします。utf-8-sig にすると目印が付き、正しく表示されます。読み込むときは utf-8-sig でも utf-8 でも読めます。古い社内システムのCSVは cp932(Shift_JIS)のこともあります。

JSON ── 設定やAPIの標準形式

json_basic.py
import json

config = {"name": "集計ツール", "version": 2, "targets": ["営業部", "開発部"]}

# 辞書 → ファイル(ensure_ascii=False で日本語をそのまま保存)
with open("config.json", "w", encoding="utf-8") as f:
    json.dump(config, f, ensure_ascii=False, indent=2)

# ファイル → 辞書
with open("config.json", encoding="utf-8") as f:
    loaded = json.load(f)

print(loaded["targets"][0])
実行結果
営業部

パスの扱い ── pathlib

ファイルの場所(パス)を文字列でつなぐと、WindowsとMacで区切り文字が違って壊れます。pathlib を使えばどちらでも動きます。

path_basic.py
from pathlib import Path

base = Path(__file__).parent        # このファイルが置かれているフォルダ
data_dir = base / "data"            # / でつなげる(OSを問わない)
data_dir.mkdir(exist_ok=True)       # 無ければ作る

target = data_dir / "sales.csv"
print(target.exists())              # あるかどうか
print(target.name, target.suffix)   # ファイル名、拡張子

# フォルダ内のCSVをすべて処理する
for csv_file in data_dir.glob("*.csv"):
    print(csv_file.name)
FileNotFoundError の9割はこれ ファイル名を "sales.csv" と書いた場合、探しに行くのは「今いるフォルダ」であって、プログラムが置いてあるフォルダとは限りません。Path(__file__).parent を基準にすれば、どこから実行しても同じ場所を見に行きます。
練習問題

上の sales.csv から、金額が10万円以上の行だけを big_sales.csv に書き出してください。

解答を見る
answer.py
import csv
from pathlib import Path

base = Path(__file__).parent
rows = []

with open(base / "sales.csv", encoding="utf-8") as f:
    for row in csv.DictReader(f):
        amount = int(row["price"]) * int(row["count"])
        if amount >= 100000:
            row["amount"] = amount
            rows.append(row)

with open(base / "big_sales.csv", "w", encoding="utf-8-sig", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=["date", "item", "price", "count", "dept", "amount"])
    writer.writeheader()
    writer.writerows(rows)

print(f"{len(rows)}件を書き出しました")
STEP 7 応用

ライブラリと仮想環境 ── 他人の成果を借りる

目安 1週間
このステップの到達点 ── 仮想環境を作り、pip でライブラリを入れ、requirements.txt で環境を再現できる。

標準ライブラリ ── 最初から入っている道具

Pythonには、追加なしで使える便利な部品が大量に付属しています。import するだけで使えます。

stdlib.py
import datetime
import random
import re

today = datetime.date.today()
print(today.strftime("%Y年%m月%d日"))
print(today + datetime.timedelta(days=30))   # 30日後

print(random.choice(["A", "B", "C"]))

text = "問い合わせは info@example.com までお願いします"
found = re.findall(r"[\w.-]+@[\w.-]+", text)   # 正規表現でメールアドレスを抽出
print(found)
実行結果(例)
2026年08月14日
2026-09-13
B
['info@example.com']

仮想環境 ── 案件ごとに道具箱を分ける

プロジェクトAでは古い版、プロジェクトBでは新しい版が必要、ということが日常的に起こります。仮想環境は、フォルダごとに専用の道具箱を作るしくみです。実務では例外なく使います。

ターミナル(プロジェクトのフォルダ内で)
# 1. 仮想環境を作る(.venv というフォルダができる)
python -m venv .venv

# 2. 有効にする
# Windows (PowerShell)
.venv\Scripts\Activate.ps1
# Mac / Linux
source .venv/bin/activate

# 有効になると、行の先頭に (.venv) と表示される
# 3. 終わるとき
deactivate
VS Codeでの選び方 仮想環境を作ったら、VS Codeの右下(または Ctrl+Shift+P → 「Python: インタープリターを選択」)で .venv を選んでください。これを忘れると、ターミナルでは入っているのにエディタ上では ModuleNotFoundError が出る、という混乱が起きます。

pip ── ライブラリを入れる

ターミナル(仮想環境を有効にした状態で)
pip install pandas requests        # まとめて入れられる
pip list                           # 入っているものを確認
pip install pandas==2.2.0          # 版を指定して入れる

# いま入っているものを一覧ファイルに書き出す
pip freeze > requirements.txt

# 別のパソコンで、同じ環境を再現する
pip install -r requirements.txt

requirements.txt は「この仕事に必要な道具の一覧」です。これをプロジェクトに含めておけば、他の人も同じ環境をすぐ作れます。チームで開発するなら必ず用意します。

新しい道具 uv 近年は uv という高速なツールが急速に普及しています。uv venvuv pip install でほぼ同じことができ、10倍以上速いのが特徴です。まずは標準の venvpip で仕組みを理解し、慣れたら乗り換えるとよいでしょう。

自作モジュールに分ける

ファイルが200行を超えたら、役割ごとに分けます。同じフォルダの .py ファイルは、そのまま import できます。

utils.py
def calc_tax_included(price: int, rate: float = 0.1) -> int:
    return int(price * (1 + rate))
main.py
from utils import calc_tax_included

print(calc_tax_included(1000))
STEP 8 応用

クラス ── 人のコードを読めるようになる

目安 1〜2週間
このステップの到達点 ── クラスの読み方がわかり、必要な場面で自分でも書ける。まず「読めること」が目標で、無理に使う必要はありません。

クラスとは「データと処理をひとまとめにした設計図」

ここまでは、データ(辞書)と処理(関数)を別々に扱ってきました。この2つが強く結びついているとき、まとめて1つにしたほうが扱いやすくなります。それがクラスです。

class_basic.py
class Order:
    """1件の注文を表す。"""

    def __init__(self, item: str, price: int, count: int):
        # 設計図から実体を作るときに呼ばれる。selfは「自分自身」
        self.item = item
        self.price = price
        self.count = count

    def amount(self) -> int:
        """この注文の金額を返す。"""
        return self.price * self.count

    def __str__(self) -> str:
        """print()したときの表示を決める。"""
        return f"{self.item} x{self.count} = {self.amount():,}円"


order = Order("ノートPC", 128000, 2)   # 実体(インスタンス)を作る
print(order.item)
print(order.amount())
print(order)
実行結果
ノートPC
256000
ノートPC x2 = 256,000円
  • クラス ── 設計図。Order のように大文字始まりで名前を付ける
  • インスタンス ── 設計図から作った実体。order
  • self ── メソッドの第1引数。「自分自身」を指す。呼ぶときは書かない
  • メソッド ── クラスの中に定義した関数

dataclass ── データを入れるだけならこれで十分

実務では、単にデータをまとめたいだけの場面が多くあります。その場合 dataclass を使うと __init__ を書かずに済みます。

dataclass_basic.py
from dataclasses import dataclass


@dataclass
class Order:
    item: str
    price: int
    count: int
    dept: str = "未設定"

    def amount(self) -> int:
        return self.price * self.count


orders = [
    Order("ノートPC", 128000, 2, "営業部"),
    Order("マウス", 2800, 10, "営業部"),
]

print(orders[0])                       # 中身が自動で見やすく表示される
print(sum(o.amount() for o in orders))
実行結果
Order(item='ノートPC', price=128000, count=2, dept='営業部')
284000
いつクラスを使うか 「データと、それに対する操作が3つ以上セットで出てくる」ときが目安です。単純な集計スクリプトなら、関数と辞書のままで十分です。使わなくてよい場面で無理にクラスにすると、かえって読みにくくなります。ただし、pandasもrequestsもFastAPIも内部はクラスでできているため、読めないと外部ライブラリのドキュメントが理解できません。読む力は必須です。
継承についても知っておく(読むときに必要)

既存のクラスの性質を引き継いで、新しいクラスを作ることを継承といいます。ライブラリを使うと class MyModel(BaseModel): のような書き方によく出会います。これは「BaseModelの機能をすべて受け継いだうえで、独自の項目を足す」という意味です。

inherit.py
class Employee:
    def __init__(self, name: str):
        self.name = name

    def greet(self) -> str:
        return f"{self.name}です"


class Manager(Employee):          # Employee を継承する
    def __init__(self, name: str, members: int):
        super().__init__(name)    # 親の__init__を呼ぶ
        self.members = members

    def greet(self) -> str:       # 同じ名前で上書きできる
        return f"{self.name}です。{self.members}名を担当しています"


print(Employee("田中").greet())
print(Manager("佐藤", 5).greet())
実行結果
田中です
佐藤です。5名を担当しています
STEP 9 実務

業務自動化 ── Excelとファイル整理を自動でやらせる

目安 2〜3週間
このステップの到達点 ── 毎月手作業でやっているExcel集計やファイル整理を、1回の実行で終わるプログラムに置きかえられる。ここが「実務で使える」の入口です。

まず、自動化する仕事の選び方

いきなり大きな仕組みを作ろうとすると失敗します。最初の題材は次の条件で選んでください。

  • 毎回まったく同じ手順である(判断が入らない)
  • 月1回以上発生する(作る手間が元を取れる)
  • 失敗しても取り返しがつく(元データを消さない、コピーを対象にする)

典型例は「複数のExcelを1つにまとめる」「決まった形の請求書を大量に作る」「ダウンロードした大量のファイルを日付ごとに振り分ける」です。

Excelを読み書きする(openpyxl)

ターミナル
pip install openpyxl
excel_basic.py
import openpyxl
from openpyxl.styles import Font

# 読み込む
wb = openpyxl.load_workbook("売上.xlsx")
ws = wb["8月"]                      # シート名で指定

print(ws["B2"].value)               # セルを1つ読む
print(ws.max_row, ws.max_column)    # 使われている範囲

# 2行目から最後まで、1行ずつ読む
total = 0
for row in ws.iter_rows(min_row=2, values_only=True):
    item, price, count = row[0], row[1], row[2]
    if price is None:               # 空行は飛ばす
        continue
    total += price * count

# 書き込んで、別名で保存する(元ファイルは壊さない)
ws["E1"] = "合計"
ws["E1"].font = Font(bold=True)
ws["E2"] = total
wb.save("売上_集計済み.xlsx")
print(f"合計 {total:,}円 を書き込みました")
元のファイルは必ず残す 自動化の事故でいちばん多いのが、元データの上書きです。wb.save() は指定した名前で保存するので、読み込んだファイル名とは別の名前にしてください。最初のうちは、対象フォルダのコピーを作ってから試すのが安全です。

フォルダ内の全Excelを1つにまとめる

実務でいちばん喜ばれる処理です。支店ごと・月ごとに分かれたファイルを、1つの表に統合します。

merge_excel.py
from pathlib import Path

import openpyxl

src_dir = Path(__file__).parent / "支店データ"
rows: list[list] = []

for xlsx in sorted(src_dir.glob("*.xlsx")):
    if xlsx.name.startswith("~$"):        # Excelが開いている時の一時ファイルを除外
        continue
    wb = openpyxl.load_workbook(xlsx, data_only=True)  # 数式でなく計算結果を読む
    ws = wb.active
    for row in ws.iter_rows(min_row=2, values_only=True):
        if row[0] is None:
            continue
        rows.append([xlsx.stem, *row])    # どのファイル由来かを1列目に残す

out = openpyxl.Workbook()
out_ws = out.active
out_ws.append(["支店", "商品", "単価", "数量"])
for row in rows:
    out_ws.append(row)
out.save(Path(__file__).parent / "統合結果.xlsx")

print(f"{len(rows)}行を統合しました")

ファイルを日付ごとに振り分ける

organize_files.py
import datetime
import shutil
from pathlib import Path

target = Path.home() / "Downloads"

for file in target.iterdir():
    if file.is_dir():
        continue
    # 更新日時を取り出して「2026-08」のようなフォルダ名にする
    mtime = datetime.datetime.fromtimestamp(file.stat().st_mtime)
    folder = target / mtime.strftime("%Y-%m")
    folder.mkdir(exist_ok=True)
    shutil.move(str(file), str(folder / file.name))
    print(f"{file.name} → {folder.name}/")
いきなり動かさない ファイルを移動・削除するプログラムは、まず shutil.move(...) の行をコメントにして print() だけを動かし、「何が起きる予定か」を目で確認してから実行してください。これを空実行(ドライラン)といい、実務では必須の手順です。
Webからデータを取る(スクレイピング)と、そのルール

Webページから情報を取り出すことをスクレイピングといいます。強力ですが、やってよい範囲を守ることが技術以上に重要です。

守るべきこと

① 相手サイトの利用規約と robots.txt を必ず確認する。② APIが公開されているならそちらを使う。③ アクセスの間隔を1秒以上あける。④ 取得したデータの著作権に配慮し、無断で再配布しない。⑤ 会員制ページや、ログインが必要な部分には手を出さない。短時間に大量のアクセスを送ると、業務妨害とみなされる可能性があります。

scrape_basic.py
import time

import requests
from bs4 import BeautifulSoup

urls = ["https://example.com/page1", "https://example.com/page2"]

for url in urls:
    res = requests.get(url, timeout=10, headers={"User-Agent": "study-bot"})
    res.raise_for_status()            # 失敗していれば例外を出す
    soup = BeautifulSoup(res.text, "html.parser")

    title = soup.select_one("h1")
    print(title.get_text(strip=True) if title else "見出しなし")

    time.sleep(1)                     # 相手に負荷をかけないための間隔
実践課題

あなたが今、手作業でやっている定型作業を1つ書き出し、「入力(何を受け取るか)」「処理(どう変えるか)」「出力(何を作るか)」の3つに分解してください。この分解ができれば、あとはここまでの知識で書けます。

STEP 10 実務

pandas ── 数万行のデータを一瞬で集計する

目安 3〜4週間
このステップの到達点 ── CSVを読み込み、絞り込み・集計・結合・グラフ化までひととおりできる。Excelでは重くて開けない量のデータを扱える。

pandasは「Pythonで動くExcel」

STEP 6ではCSVを1行ずつ読みましたが、行数が増えると書くのも動かすのも大変です。pandasを使うと、表全体をまとめて操作できます。データ分析の仕事では、事実上の標準です。

ターミナル
pip install pandas openpyxl matplotlib

読み込みと、最初に見るべきこと

pandas_basic.py
import pandas as pd

df = pd.read_csv("sales.csv", encoding="utf-8")

print(df.head())        # 先頭5行
print(df.shape)         # (行数, 列数)
print(df.dtypes)        # 各列の型
print(df.info())        # 欠損の有無をまとめて確認
print(df.describe())    # 数値列の平均・最大・最小など
実行結果(head の部分)
         date      item   price  count  dept
0  2026-08-01  ノートPC  128000      2  営業部
1  2026-08-01    マウス    2800     10  営業部
2  2026-08-02  モニター   32000      4  開発部
3  2026-08-03  キーボード   8600      6  開発部
最初の10分は必ず「データを見る」 実務のデータは必ず汚れています。空欄、全角半角の混在、日付が文字列、同じ部署名の表記ゆれ。df.info()df["dept"].unique() で状態を確認してから作業を始めると、後戻りが激減します。

列の追加、絞り込み、並べかえ

pandas_select.py
import pandas as pd

df = pd.read_csv("sales.csv")

# 新しい列を作る(すべての行に一括で計算される)
df["amount"] = df["price"] * df["count"]

# 条件で絞り込む
big = df[df["amount"] >= 100000]
sales_dept = df[(df["dept"] == "営業部") & (df["amount"] >= 10000)]

# 並べかえ、上位だけ取り出す
top3 = df.sort_values("amount", ascending=False).head(3)

# 必要な列だけ取り出す
print(top3[["item", "dept", "amount"]])
実行結果
      item  dept  amount
0  ノートPC 営業部  256000
2  モニター 開発部  128000
3 キーボード 開発部   51600
条件を組み合わせるときの注意 pandasでは and / or ではなく & / | を使い、それぞれの条件をかっこで囲む必要があります。かっこを忘れると分かりにくいエラーになります。

集計する(groupby)── pandasの主役

pandas_group.py
import pandas as pd

df = pd.read_csv("sales.csv")
df["amount"] = df["price"] * df["count"]

# 部署ごとの合計
print(df.groupby("dept")["amount"].sum())

# 複数の集計を同時に
summary = df.groupby("dept").agg(
    合計=("amount", "sum"),
    平均=("amount", "mean"),
    件数=("amount", "count"),
)
print(summary)

# 日付ごと × 部署ごとのクロス集計(Excelのピボットテーブル)
pivot = df.pivot_table(index="date", columns="dept", values="amount",
                       aggfunc="sum", fill_value=0)
print(pivot)
実行結果
dept
営業部    284000
開発部    179600
Name: amount, dtype: int64

         合計      平均  件数
dept
営業部  284000  142000.0   2
開発部  179600   89800.0   2

汚れたデータを整える

pandas_clean.py
import pandas as pd

df = pd.read_csv("sales.csv")

df["price"] = df["price"].fillna(0)                 # 空欄を0で埋める
df = df.dropna(subset=["item"])                     # 商品名が空の行は捨てる
df = df.drop_duplicates()                           # 完全に同じ行を除く
df["dept"] = df["dept"].str.strip()                 # 前後の空白を取る
df["date"] = pd.to_datetime(df["date"])             # 文字列を日付型に変換
df["month"] = df["date"].dt.strftime("%Y-%m")       # 月の列を作る

# 表記ゆれをまとめる
df["dept"] = df["dept"].replace({"営業": "営業部", "開発G": "開発部"})

2つの表をつなぐ(merge)とExcel出力

pandas_merge.py
import pandas as pd

sales = pd.read_csv("sales.csv")
master = pd.read_csv("item_master.csv")   # item, category の対応表

# Excelのvlookupに相当。how="left" は「左の表の行はすべて残す」
merged = pd.merge(sales, master, on="item", how="left")
print(merged["category"].isna().sum())    # 対応表に無かった件数を確認

# 複数シートに分けてExcelに書き出す
with pd.ExcelWriter("報告書.xlsx", engine="openpyxl") as writer:
    merged.to_excel(writer, sheet_name="明細", index=False)
    merged.groupby("dept")["price"].sum().to_excel(writer, sheet_name="部署別")

グラフにする

plot_basic.py
import matplotlib.pyplot as plt
import pandas as pd

plt.rcParams["font.family"] = "Meiryo"   # Macは "Hiragino Sans"

df = pd.read_csv("sales.csv")
df["amount"] = df["price"] * df["count"]

summary = df.groupby("dept")["amount"].sum()

summary.plot(kind="bar", color="#0e7c74")
plt.title("部署別の売上")
plt.ylabel("金額(円)")
plt.tight_layout()
plt.savefig("sales.png", dpi=150)
print("sales.png を保存しました")
グラフの日本語が □□□ になるとき matplotlibは初期状態で日本語のフォントを持っていません。上のように font.family を指定するか、pip install japanize-matplotlib を入れて import japanize_matplotlib と書けば解決します。
実践課題

手元にある実際のCSV(家計簿、売上、アクセスログなど何でも)を読み込み、①行数と列の型を確認 ②不要な行を除く ③何かの単位で集計 ④結果をExcelに書き出す、までを1本のスクリプトにしてください。この一連の流れが、データ分析の実務そのものです。

STEP 11 実務

Web APIを使う・作る

目安 2〜3週間
このステップの到達点 ── 外部サービスのAPIからデータを取得できる。自分でも簡単なAPIを作って動かせる。

APIとは「機械のための窓口」

人間向けのWebページとは別に、プログラムからデータを受け取るための入口が用意されていることがあります。これがAPIです。天気、為替、地図、社内システムなど、実務のデータ連携はほぼAPI経由です。

api_get.py
import requests

url = "https://api.github.com/repos/python/cpython"
res = requests.get(url, timeout=10)
res.raise_for_status()          # 200番台以外なら例外にする

data = res.json()               # JSONを辞書に変換
print(data["full_name"])
print(f"スター数: {data['stargazers_count']:,}")
実行結果(例)
python/cpython
スター数: 64,000

ステータスコードの読み方

番号意味対処
200成功そのまま処理を進める
400こちらの送り方が不正パラメータの綴りや形式を見直す
401 / 403認証・権限がないAPIキーの設定、権限の範囲を確認
404その場所に何もないURLとIDを確認
429送りすぎ間隔をあけて再試行する
500番台相手側の不具合時間をおいて再試行。こちらの問題ではない

APIキーは絶対にコードに書かない

多くのAPIは、利用者を識別する秘密の文字列(APIキー)を必要とします。これをソースコードに直接書き、そのままGitHubに公開してしまう事故が後を絶ちません。不正利用され高額請求につながります。

.env(このファイルは絶対に共有しない)
API_KEY=abcd1234efgh5678
api_secure.py
import os

import requests
from dotenv import load_dotenv   # pip install python-dotenv

load_dotenv()                    # .env を読み込んで環境変数にする
api_key = os.environ["API_KEY"]  # 無ければここでエラーになるので気づける

res = requests.get(
    "https://api.example.com/v1/data",
    headers={"Authorization": f"Bearer {api_key}"},
    timeout=10,
)
print(res.status_code)
.gitignore.env を必ず書く STEP 12で扱うGitでは、これを書いておかないと秘密のファイルまで公開されます。一度公開したキーは、削除しても漏れたものとして扱い、必ず作り直してください。

自分でAPIを作る(FastAPI)

作った集計処理を、他の人やシステムから呼べるようにするのがAPI化です。FastAPIなら20行ほどで動きます。

ターミナル
pip install fastapi uvicorn
uvicorn app:app --reload
app.py
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class TaxRequest(BaseModel):
    price: int
    rate: float = 0.1


@app.get("/health")
def health() -> dict:
    return {"status": "ok"}


@app.post("/tax")
def calc_tax(req: TaxRequest) -> dict:
    """税込価格を計算して返す。"""
    return {"price": req.price, "total": int(req.price * (1 + req.rate))}

起動したら、ブラウザで http://127.0.0.1:8000/docs を開いてください。操作画面つきのドキュメントが自動で生成され、その場で試せます。これがFastAPIが実務で選ばれる理由です。

Flask / Django との違い Flaskは最小限の機能に絞った古株で、学習用の情報が多いのが利点です。Djangoは管理画面やデータベース機能まで最初から揃った大型フレームワークで、本格的なWebサービス向けです。FastAPIは型ヒントを活かした自動検証と自動ドキュメントが強みで、データを返すAPIを作るなら現在の第一候補です。
STEP 12 実務

現場の作法 ── Git・テスト・整形・ログ

目安 3〜4週間
このステップの到達点 ── Gitで変更を記録し、pytestでテストを書き、整形ツールを通せる。ここまで来て初めて「チームで働ける人」になります。

1. Git ── 変更の履歴を残す

Gitは、いつ・誰が・どこを変えたかを記録する仕組みです。実務で使わない現場はまずありません。「壊しても前の状態に戻せる」という安心が、思い切った改修を可能にします。

ターミナル(最初の1回)
git config --global user.name "Your Name"
git config --global user.email "you@example.com"

cd python-study
git init                      # このフォルダの記録を開始する
ターミナル(毎日の流れ)
git status                    # 今どこが変わっているか
git add .                     # 記録する対象に入れる
git commit -m "売上集計にCSV出力を追加"   # 変更を1つの区切りとして記録
git log --oneline             # これまでの記録を見る

# GitHubなど、別の場所へ送る
git push origin main
.gitignore
.venv/
__pycache__/
*.pyc
.env
data/*.csv
.DS_Store
コミットの単位 「1つの意味のある変更」で1コミットです。-m のメッセージには「何をしたか」を日本語で書いて構いません。update修正 だけでは、半年後の自分が困ります。

2. テスト ── 直したつもりが壊れていないか確かめる

プログラムを直すと、別の場所が壊れることがあります。それを自動で検知するのがテストです。手で確かめるのは、規模が大きくなると不可能になります。

ターミナル
pip install pytest
pytest -v
test_utils.py(ファイル名は test_ で始める)
import pytest

from utils import calc_tax_included


def test_normal():
    assert calc_tax_included(1000) == 1100


def test_rate_given():
    assert calc_tax_included(1000, 0.08) == 1080


def test_zero():
    assert calc_tax_included(0) == 0


def test_negative_raises():
    """負の金額はエラーにする、という仕様にした場合"""
    with pytest.raises(ValueError):
        calc_tax_included(-100)
実行結果
test_utils.py::test_normal PASSED
test_utils.py::test_rate_given PASSED
test_utils.py::test_zero PASSED
test_utils.py::test_negative_raises FAILED

テストを書くときは、ふつうの場合・境界の場合(0や空)・異常な場合の3つを考えます。これは学習にも効果があり、テストが書きにくい関数は、たいてい設計が悪い関数です。

3. コードの整形と点検

書き方の細かい差(スペースの位置、引用符の種類)で悩む時間は無駄です。ツールに任せて自動でそろえます。近年は ruff 一つで整形と点検の両方ができます。

ターミナル
pip install ruff
ruff format .        # 書式を自動でそろえる
ruff check .         # 未使用の変数、危ない書き方などを指摘
ruff check . --fix   # 直せるものは自動で直す

4. print ではなく logging を使う

自分だけが動かす間は print() で十分ですが、定期実行させるものや人に渡すものでは、いつ何が起きたかを記録に残す必要があります。

logging_basic.py
import logging

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[
        logging.FileHandler("app.log", encoding="utf-8"),
        logging.StreamHandler(),      # 画面にも出す
    ],
)
logger = logging.getLogger(__name__)


def main() -> None:
    logger.info("処理を開始します")
    try:
        result = 100 / 0
    except ZeroDivisionError:
        logger.exception("計算に失敗しました")   # エラーの詳細も記録される
    logger.info("処理を終了します")


if __name__ == "__main__":
    main()
実行結果(app.log にも同じ内容が残る)
2026-08-14 10:12:03,481 [INFO] 処理を開始します
2026-08-14 10:12:03,482 [ERROR] 計算に失敗しました
Traceback (most recent call last):
  ...
ZeroDivisionError: division by zero
2026-08-14 10:12:03,483 [INFO] 処理を終了します

5. プロジェクトの標準的な構成

フォルダ構成の例
sales-report/
├── .venv/              # 仮想環境(Gitには含めない)
├── .env                # 秘密情報(Gitには含めない)
├── .gitignore
├── README.md           # 何をするものか、どう動かすかを書く
├── requirements.txt    # 必要なライブラリ
├── src/
│   ├── __init__.py
│   ├── main.py         # 入口
│   ├── loader.py       # データの読み込み
│   └── summarize.py    # 集計処理
├── tests/
│   └── test_summarize.py
└── data/               # 入力データ(Gitには含めない)
README.md が実務の分かれ目 自分以外の人(と3か月後の自分)が動かせるように、何をするものか・必要な準備・実行コマンド・注意点の4つを書きます。これがあるかないかで、そのコードが使い続けられるかが決まります。
STEP 13 実務

実力を証明する ── 作品を作り、続ける

目安 継続
このステップの到達点 ── 人に見せられる作品が1つある。学び続ける手段を持っている。

「勉強しました」より「作りました」

採用や社内での評価で見られるのは、学習時間ではなく動くものです。規模は小さくてかまいません。次の条件を満たすものを1つ作ってください。

  • 実際に困っていたことを解決している ── 課題が本物だと、説明に説得力が出ます
  • GitHubに置いてある ── READMEがあり、他人が動かせる状態になっている
  • テストが少しでもある ── 品質を意識できることの証明になります
  • なぜそう作ったかを説明できる ── 技術選定の理由を聞かれます

題材の例 ── 家計簿CSVを月別に集計してグラフを出すツール、複数のExcelを統合する社内向けスクリプト、気になるサイトの更新を毎朝知らせる仕組み、読書記録を管理する小さなWebアプリ。

これから伸ばす方向を選ぶ

方向次に学ぶこと向いている人
データ分析SQL、統計の基礎、可視化(plotly)、BIツール数字から意思決定を助けたい人
Web開発HTML/CSS/JavaScript、データベース、Django・FastAPI、クラウドサービスを作りたい人
業務自動化・RPAExcel実務、スケジュール実行、社内システム連携今の職場をすぐ楽にしたい人
機械学習・AI数学(線形代数・確率)、scikit-learn、PyTorch、LLM API研究・予測に取り組みたい人

※ 4つすべてをやろうとすると、どれも中途半端になります。まず1つ選び、そこで小さな成果を出してから広げてください。

AIとの付き合い方

今はAIにコードを書かせられる時代です。使わないのは損ですが、使い方を誤るといつまでも実力がつきません。次の線引きを守ってください。

  • やってよい ── エラーの原因を相談する、書いたコードを説明させる、より良い書き方を尋ねる、テスト項目を洗い出させる
  • 気をつける ── 出てきたコードを読まずに貼り付ける。動いても、なぜ動くか説明できないなら自分の力にはなっていません
  • 絶対にしない ── 会社の実データ、顧客情報、APIキーを、社の許可なく外部サービスへ貼り付ける

おすすめは、まず自分で書いてからAIにレビューさせる順番です。自分の答えと比べることで、どこが弱いかがはっきりします。

学び続けるための情報源

  • 公式ドキュメント ── 最も正確です。日本語版もあります。ライブラリを使う前に、まず公式を見る癖をつけてください
  • コードを読む ── GitHubで人気のあるPythonプロジェクトを読むと、書き方の水準が上がります
  • 手を止めない ── 週に1回でも、何か書き足す。3か月空けると、驚くほど忘れます
詰まったときの合言葉 ①エラー全文を読む ②公式ドキュメントを見る ③最小のコードで再現する ④それでもだめなら、やりたいこと・コード・エラー全文を添えて聞く。この4手順で、実務の問題のほとんどは解決します。

実務でよく使うライブラリ早見表

名前と用途を知っておくだけで、調べる速度が変わります
名前用途導入学ぶ時期
pandas表形式データの読み込み・集計・加工pip install pandasSTEP 10
openpyxlExcelファイル(.xlsx)の読み書き・書式設定pip install openpyxlSTEP 9
requestsWeb APIの呼び出し、ファイルのダウンロードpip install requestsSTEP 11
beautifulsoup4HTMLからの情報抽出(スクレイピング)pip install beautifulsoup4STEP 9
matplotlibグラフの作成、画像としての保存pip install matplotlibSTEP 10
FastAPIWeb APIサーバーの作成pip install fastapi uvicornSTEP 11
pytest自動テストpip install pytestSTEP 12
ruffコードの整形と点検pip install ruffSTEP 12
python-dotenvAPIキーなど秘密情報の読み込みpip install python-dotenvSTEP 11
SQLAlchemyデータベースの操作pip install sqlalchemySTEP 13以降
scikit-learn機械学習(分類・予測・クラスタリング)pip install scikit-learnSTEP 13以降

※ ライブラリはすべてを覚える必要はありません。「こういうことができる道具がある」と知っていることが重要で、使い方はそのつど公式ドキュメントを見れば十分です。

3か月の学習プラン例

1日1時間、週5日で進めた場合の目安
時期やることその週の到達目標
1週目STEP 0〜1環境を整え、変数と型を使った計算ができる
2〜3週目STEP 2〜3条件分岐とくり返し、リスト・辞書で集計できる
4〜5週目STEP 4〜5関数に分けて書き、エラーを自力で直せる
6〜7週目STEP 6〜7CSVを読み書きし、ライブラリを入れて使える
8週目STEP 8+復習クラスが読める。ここまでの内容で小さなツールを1本作る
9〜10週目STEP 9自分の仕事の作業を1つ自動化する
11〜12週目STEP 10pandasで実データを集計し、レポートを出力する
13週目〜STEP 11〜13APIとGit・テストを身につけ、作品をGitHubに公開する
続けるためのコツ ① 毎日同じ時間にやる(時間を決めないと必ずやらなくなります)② 1日の終わりに「明日はここから」と1行メモを残す ③ 完璧に理解してから次に進もうとしない。8割わかったら先に進み、必要になったときに戻るほうが、結局は速く身につきます。

用語集

調べものの途中で出てきたら、ここに戻ってください
変数 variable
値に名前を付けて取っておく仕組み。price = 120 のように書きます。
関数 function
処理に名前を付けてまとめたもの。材料を引数で受け取り、結果を戻り値で返します。
引数 argument
関数に渡す値。「ひきすう」と読みます。
戻り値 return value
関数が返す結果。return で指定します。
インデント indent
行頭の字下げ。Pythonでは処理のまとまりを表す文法の一部で、半角スペース4つが標準です。
モジュール module
1つの .py ファイル。import で他のファイルから読み込めます。
ライブラリ library
他人が作った便利な部品の集まり。pip で導入します。
仮想環境 venv
プロジェクトごとにライブラリを分けて管理する仕組み。実務では必須です。
例外 exception
実行中に起きた異常。try / except で受け止められます。
トレースバック traceback
エラーが起きるまでの経路を示す表示。いちばん下の行から読みます。
デバッグ debug
不具合の原因を探して直す作業。プログラミング時間の多くを占めます。
リポジトリ repository
Gitが変更履歴を管理する単位。だいたい「プロジェクトのフォルダ」と同じ意味です。
コミット commit
変更を1つの区切りとして記録すること。
API Application Programming Interface
プログラムから他のサービスを利用するための窓口。
JSON JavaScript Object Notation
データをやり取りするための書式。Pythonの辞書とよく似た形をしています。
環境変数 environment variable
パソコンやサーバー側に設定しておく値。APIキーなど秘密情報の受け渡しに使います。

よくある質問

学び始めるときに、多くの人が迷うこと
数学が苦手でも大丈夫ですか

業務自動化やWeb開発なら、必要なのは小学校の算数(四則演算と割合)程度です。機械学習に進む場合のみ、統計と線形代数の知識が必要になります。まずは自動化やデータ集計から始めれば、数学が壁になることはありません。

本と動画、どちらがよいですか

どちらでも構いませんが、手を動かす時間が全体の7割を下回ると身につきません。読んだり見たりして理解した気になるのが、最大の落とし穴です。1つの単元を学んだら、必ず教材を閉じて、何も見ずに書いてみてください。書けなければ理解していません。

ProgateやPaizaなどの学習サイトはどう使えばよいですか

環境構築なしにブラウザで書けるので、STEP 1〜4の基礎を反復するのに向いています。ただし、そこで完結させないでください。実務との差は「自分のパソコンで、自分のデータを、自分で用意した環境で動かせるか」にあります。基礎が一巡したら、必ず自分の環境(STEP 0)に移ってください。

どのくらいで仕事に使えるようになりますか

「今の仕事の一部を自動化する」レベルなら、毎日1時間で3か月ほどが目安です(STEP 9まで)。転職して開発職に就くレベルとなると、Git・テスト・データベース・チーム開発の経験が要るため、半年から1年を見ておくのが現実的です。ただし、これは学習時間ではなく作ったものの数で決まります。

Pythonのバージョンはどれを選べばよいですか

学習用なら、公式サイトで配布されている最新版で問題ありません。仕事で既存のシステムに関わる場合のみ、その現場で使われている版に合わせます。3.10以降であれば、このページの内容はすべて動きます。なお、Python 2という古い系統の情報がインターネット上に残っていますが、print "文字" のようにかっこの無い書き方は現在では動きません。

他の言語も学ぶべきですか

まずPythonを1つ、実務で使えるところまで深めてください。2つ目を中途半端に増やすより、1つで成果を出すほうが評価されます。そのうえで、Web開発に進むならJavaScript、データ分析に進むならSQLが自然な2つ目です。1つの言語を深く学べば、2つ目の習得は驚くほど速くなります。

👪 保護者・先生のみなさまへ

このページは、プログラミングをこれから学ぶ中学生以上の方と、お子さまの学習に付き添う保護者の方に向けて構成しています。前半(STEP 0〜4)は、中学生でも取り組める内容です。後半は職業として使う場面を想定しているため、必要になったときに戻ってくる資料として使ってください。

お子さまが学ぶ場合、最初の関門は環境構築(STEP 0)です。ここは学習内容ではなく単なる設定作業ですが、うまくいかないと「自分には向いていない」と誤解しやすい場所でもあります。可能であれば、最初の1回だけ大人が一緒に画面を見てあげてください。それを越えれば、あとは本人のペースで進められます。

プログラミング学習で身につくのは、言語の知識だけではありません。大きな問題を小さく分けて考える力、思いどおりにならない原因を順序立てて探る力、そして「まちがいは直せばよい」という感覚です。エラーが出ることは失敗ではなく、コンピュータが手がかりを教えてくれている状態です。この考え方は、プログラミングを職業にしなくても一生役に立ちます。

お子さまがつまずいたとき、答えを教えるより「エラーには何と書いてある?」「どこまでは思ったとおりに動いた?」と問いかけてみてください。原因を自分で切り分ける経験こそが、このページで最も伝えたい力です。

なお、STEP 9以降には、Webからの情報取得やAPIキーの取り扱いなど、ルールとマナーが関わる内容が含まれます。技術的にできることと、してよいことは別です。他者のサーバーに負荷をかけない、秘密の情報を外部に出さない、といった点は、大人からも折に触れて伝えていただければと思います。