📄 ステップ20: ファイルの読み書き
テキストファイルやCSVファイルを読み書きして、データを保存・活用しよう!
今まで作ったプログラムは、実行が終わるとデータが消えてしまいました。でも実際のプログラムでは、データを保存したり、保存したデータを読み込んだりする必要があります。
📖 このステップで学ぶこと
・ファイルの読み込み方法
・ファイルへの書き込み方法
・with文(安全なファイル操作)
・CSVファイルの読み書き
・エラー処理
🎯 1. ファイル操作って何?
🔰 ファイル操作が必要な場面
ファイル操作は、こんな時に使います:
📌 ファイル操作の活用例
| 場面 | ファイルの種類 | 操作 |
| ゲームのスコアを保存 | テキストファイル | 書き込み |
| 設定ファイルを読む | 設定ファイル | 読み込み |
| ログを記録する | ログファイル | 追記 |
| 顧客データを分析 | CSVファイル | 読み込み |
💡 ファイル操作のメリット
・プログラム終了後もデータが残る(永続化)
・他のプログラムとデータを共有できる
・大量のデータを扱える
・Excelなどの他のソフトとデータをやり取りできる
📖 2. ファイルを開くモード
ファイルを扱う時は、まずどんな目的で開くかを指定します。これを「モード」と呼びます。
📌 ファイルを開くモード一覧
| モード | 意味 | ファイルがない時 | ファイルがある時 |
| “r” | 読み込み(read) | エラー | 内容を読む |
| “w” | 書き込み(write) | 新規作成 | 上書き(元のデータは消える) |
| “a” | 追記(append) | 新規作成 | 最後に追加 |
⚠️ 「w」モードの注意
「w」モードは既存のファイルを完全に上書きします。
元のデータは消えてしまうので、大切なファイルには注意!
追記したい場合は「a」モードを使いましょう。
📥 3. ファイルの読み込み
📝 基本的な読み込み(open と close)
まず、最も基本的なファイルの読み込み方法を見てみましょう。
📝 open() の構文
open(ファイル名, モード, encoding="utf-8")
・ファイル名:読み込むファイルの名前
・モード:”r”(読み込み)、”w”(書き込み)、”a”(追記)
・encoding:文字コード(日本語を扱う時は”utf-8″を指定)
完成コード:ファイル全体を読み込む
※スマートフォンでは横スクロールできます
# open() - ファイルを開く
# "r" - 読み込みモード
# encoding="utf-8" - 日本語を正しく読むために必要
file = open("sample.txt", "r", encoding="utf-8")
# read() - ファイルの内容を全て読み込む
content = file.read()
# 内容を表示
print(content)
# close() - ファイルを閉じる(重要!)
file.close()
実行結果(sample.txtの内容による)
こんにちは! これはサンプルファイルです。 Pythonでファイルを読み込んでいます。
⚠️ close()を忘れずに!
ファイルを開いたら、必ずclose()で閉じる必要があります。
閉じないと、ファイルがロックされたままになったり、データが正しく保存されない可能性があります。
(後で紹介するwith文を使えば、この心配は不要になります)
📝 1行ずつ読み込む
大きなファイルを扱う時は、1行ずつ読み込むとメモリを節約できます。
完成コード:1行ずつ読み込む
※スマートフォンでは横スクロールできます
file = open("sample.txt", "r", encoding="utf-8")
# ファイルオブジェクトをfor文で回すと、1行ずつ読み込める
for line in file:
# strip() - 行末の改行文字を削除
print(line.strip())
file.close()
実行結果
こんにちは! これはサンプルファイルです。 Pythonでファイルを読み込んでいます。
💡 strip()を使う理由
ファイルの各行には、末尾に改行文字(\n)が含まれています。
strip()を使うと、この改行文字を削除できます。
使わないと、print()の改行と合わせて2行分空いてしまいます。
📝 全ての行をリストとして読み込む
完成コード:リストとして読み込む
※スマートフォンでは横スクロールできます
file = open("sample.txt", "r", encoding="utf-8")
# readlines() - 全ての行をリストとして読み込む
# 各行が1つの要素になる
lines = file.readlines()
file.close()
# 行数を表示
print(f"行数: {len(lines)}")
# 行番号付きで表示
for i, line in enumerate(lines, start=1):
print(f"{i}: {line.strip()}")
実行結果
行数: 3 1: こんにちは! 2: これはサンプルファイルです。 3: Pythonでファイルを読み込んでいます。
📌 読み込み方法の比較
| メソッド | 結果 | 用途 |
read() |
1つの文字列 | 全体を一度に処理したい時 |
for line in file: |
1行ずつ処理 | 大きなファイル、メモリ節約 |
readlines() |
行のリスト | 行数を知りたい時、特定の行にアクセス |
🔒 4. with文 – 安全なファイル操作
open()とclose()を使う方法は、close()を忘れる危険があります。with文を使うと、この問題を解決できます。
🔰 with文とは
with文を使うと、ファイルを自動的に閉じてくれます。
📝 with文の構文
with open(ファイル名, モード, encoding="utf-8") as 変数名:
# ファイル操作(インデントされたブロック内で行う)
# ブロックを抜けると自動的にファイルが閉じられる
完成コード:with文で読み込み
※スマートフォンでは横スクロールできます
# with文を使うと、close()が不要
# ブロックを抜けると自動的にファイルが閉じられる
with open("sample.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)
# ここでファイルは既に閉じられている
print("ファイルは自動的に閉じられました")
実行結果
こんにちは! これはサンプルファイルです。 Pythonでファイルを読み込んでいます。 ファイルは自動的に閉じられました
💡 with文のメリット
・close()を書き忘れる心配がない
・エラーが起きてもファイルが正しく閉じられる
・コードが読みやすくなる
推奨:ファイル操作は常にwith文を使いましょう!
📝 with文で1行ずつ処理
完成コード:with文で1行ずつ
※スマートフォンでは横スクロールできます
with open("sample.txt", "r", encoding="utf-8") as file:
# for文で1行ずつ処理
for i, line in enumerate(file, start=1):
print(f"{i}: {line.strip()}")
実行結果
1: こんにちは! 2: これはサンプルファイルです。 3: Pythonでファイルを読み込んでいます。
📝 5. ファイルへの書き込み
📝 新しいファイルを作成して書き込む
モード"w"を使うと、新しいファイルを作成して書き込めます。
完成コード:ファイルを作成して書き込む
※スマートフォンでは横スクロールできます
# "w" - 書き込みモード(ファイルがなければ作成)
with open("output.txt", "w", encoding="utf-8") as file:
# write() - 文字列を書き込む
# \n は改行文字(これがないと1行になる)
file.write("こんにちは、世界!\n")
file.write("Pythonからファイルに書き込みました。\n")
file.write("3行目のテキストです。\n")
print("ファイルに書き込みました!")
実行結果
ファイルに書き込みました!
💡 改行文字 \n について
write()は自動で改行を入れません。
改行したい場所に\nを入れる必要があります。
print()と違うので注意!
📝 作成したファイルを確認
完成コード:書き込んだ内容を確認
※スマートフォンでは横スクロールできます
# 書き込んだファイルを読み込んで確認
with open("output.txt", "r", encoding="utf-8") as file:
print("=== output.txt の内容 ===")
print(file.read())
実行結果
=== output.txt の内容 === こんにちは、世界! Pythonからファイルに書き込みました。 3行目のテキストです。
📝 複数行を一度に書き込む(writelines)
完成コード:リストを一度に書き込む
※スマートフォンでは横スクロールできます
# 書き込む内容をリストで用意
# 各行に \n を付けておく
lines = [
"1行目のテキスト\n",
"2行目のテキスト\n",
"3行目のテキスト\n"
]
with open("output.txt", "w", encoding="utf-8") as file:
# writelines() - リストの内容を全て書き込む
file.writelines(lines)
print("複数行を書き込みました!")
実行結果
複数行を書き込みました!
📝 ファイルに追記する
モード"a"を使うと、既存のファイルの最後に追加できます。
完成コード:ファイルに追記
※スマートフォンでは横スクロールできます
# "a" - 追記モード(ファイルの最後に追加)
with open("output.txt", "a", encoding="utf-8") as file:
file.write("これは追記した行です。\n")
file.write("さらに追記しました。\n")
print("ファイルに追記しました!")
# 内容を確認
with open("output.txt", "r", encoding="utf-8") as file:
print("=== 追記後の内容 ===")
print(file.read())
実行結果
ファイルに追記しました! === 追記後の内容 === 1行目のテキスト 2行目のテキスト 3行目のテキスト これは追記した行です。 さらに追記しました。
📌 書き込みモードの比較
| モード | 動作 | 使う場面 |
| “w”(write) | 新規作成または上書き | 新しいデータで置き換えたい時 |
| “a”(append) | 最後に追加 | ログ記録、データを蓄積したい時 |
🎯 6. 実践的な例
ここまで学んだことを使って、実際に役立つプログラムを作ってみましょう。
📝 実践例1:ログファイルの作成
プログラムの動作を記録するログファイルを作成します。
完成コード:ログを記録する関数
※スマートフォンでは横スクロールできます
from datetime import datetime
def write_log(message):
"""メッセージをログファイルに記録する関数"""
# 現在の日時を取得してフォーマット
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# "a"モードで追記(ファイルがなければ作成)
with open("log.txt", "a", encoding="utf-8") as file:
# [日時] メッセージ の形式で書き込む
file.write(f"[{timestamp}] {message}\n")
# ログを記録
write_log("プログラム開始")
write_log("ユーザーがログインしました")
write_log("データを処理しています")
write_log("処理が完了しました")
write_log("プログラム終了")
print("ログを記録しました!")
# ログファイルの内容を確認
with open("log.txt", "r", encoding="utf-8") as file:
print("\n=== log.txt の内容 ===")
print(file.read())
実行結果
ログを記録しました! === log.txt の内容 === [2024-11-08 14:30:45] プログラム開始 [2024-11-08 14:30:45] ユーザーがログインしました [2024-11-08 14:30:45] データを処理しています [2024-11-08 14:30:45] 処理が完了しました [2024-11-08 14:30:45] プログラム終了
📝 実践例2:スコアの保存と読み込み
ゲームのスコアを保存して、後から読み込む機能を作ります。
完成コード:スコアを保存する関数
※スマートフォンでは横スクロールできます
def save_score(name, score):
"""スコアをファイルに保存する関数"""
# "a"モードで追記
with open("scores.txt", "a", encoding="utf-8") as file:
# 名前,スコア の形式で保存
file.write(f"{name},{score}\n")
print(f"{name}さんのスコア({score}点)を保存しました")
def load_scores():
"""スコアをファイルから読み込む関数"""
scores = []
with open("scores.txt", "r", encoding="utf-8") as file:
for line in file:
# strip()で改行を削除、split(",")でカンマで分割
name, score = line.strip().split(",")
# スコアを整数に変換してリストに追加
scores.append((name, int(score)))
return scores
# スコアを保存
save_score("太郎", 850)
save_score("花子", 920)
save_score("次郎", 780)
# スコアを読み込んで表示
print("\n=== ハイスコア ===")
all_scores = load_scores()
# スコア順にソート(高い順)
all_scores.sort(key=lambda x: x[1], reverse=True)
for rank, (name, score) in enumerate(all_scores, start=1):
print(f"{rank}位: {name} - {score}点")
実行結果
太郎さんのスコア(850点)を保存しました 花子さんのスコア(920点)を保存しました 次郎さんのスコア(780点)を保存しました === ハイスコア === 1位: 花子 - 920点 2位: 太郎 - 850点 3位: 次郎 - 780点
📝 実践例3:ToDoリストの管理
タスクを追加・表示・削除できるToDoリストを作ります。
完成コード:ToDoリスト
※スマートフォンでは横スクロールできます
def add_task(task):
"""タスクを追加する関数"""
with open("todo.txt", "a", encoding="utf-8") as file:
file.write(f"{task}\n")
print(f"タスクを追加: {task}")
def show_tasks():
"""全タスクを表示する関数"""
try:
with open("todo.txt", "r", encoding="utf-8") as file:
tasks = file.readlines()
if not tasks:
print("タスクはありません")
return
print("\n=== ToDoリスト ===")
for i, task in enumerate(tasks, start=1):
print(f"{i}. {task.strip()}")
except FileNotFoundError:
print("タスクはありません")
def clear_tasks():
"""全タスクを削除する関数"""
# "w"モードで空のファイルを作成(上書き)
with open("todo.txt", "w", encoding="utf-8") as file:
pass # 何も書き込まない
print("全タスクを削除しました")
# 使用例
add_task("宿題をする")
add_task("買い物に行く")
add_task("メールを返信する")
show_tasks()
実行結果
タスクを追加: 宿題をする タスクを追加: 買い物に行く タスクを追加: メールを返信する === ToDoリスト === 1. 宿題をする 2. 買い物に行く 3. メールを返信する
📝 実践例4:単語数をカウント
テキストファイルの文字数・単語数・行数を数えます。
完成コード:テキスト分析
※スマートフォンでは横スクロールできます
def analyze_text(filename):
"""テキストファイルを分析する関数"""
with open(filename, "r", encoding="utf-8") as file:
content = file.read()
# 文字数(スペースを含む)
char_count = len(content)
# 文字数(スペースを含まない)
char_count_no_space = len(content.replace(" ", "").replace("\n", ""))
# 単語数(スペースや改行で分割)
words = content.split()
word_count = len(words)
# 行数
lines = content.split("\n")
line_count = len(lines)
print(f"=== {filename} の分析結果 ===")
print(f"文字数(スペース含む): {char_count}")
print(f"文字数(スペースなし): {char_count_no_space}")
print(f"単語数: {word_count}")
print(f"行数: {line_count}")
# 使用例
analyze_text("sample.txt")
実行結果(例)
=== sample.txt の分析結果 === 文字数(スペース含む): 72 文字数(スペースなし): 68 単語数: 5 行数: 3
📊 7. CSVファイルの基礎
CSV(Comma-Separated Values)は、データをカンマで区切ったファイル形式です。ExcelやGoogleスプレッドシートでも使える、とても便利な形式です。
🔰 CSVファイルとは
📌 CSVファイルの構造
CSVファイルは、こんな形式になっています:
名前,年齢,点数 太郎,15,85 花子,14,92 次郎,16,78
・1行目がヘッダー(列名)
・2行目以降がデータ
・各項目はカンマ(,)で区切る
💡 CSVファイルのメリット
・Excel、Googleスプレッドシートで開ける
・テキストなので軽量
・プログラムで扱いやすい
・データの受け渡しに便利
📝 csvモジュールの使い方
Pythonにはcsvモジュールがあり、CSVファイルを簡単に扱えます。
📝 CSVファイルへの書き込み
まず、CSVファイルを作成してみましょう。
完成コード:CSVファイルを作成
※スマートフォンでは横スクロールできます
import csv
# 書き込むデータ(リストのリスト)
# 1行目がヘッダー
students = [
["名前", "年齢", "点数"],
["太郎", 15, 85],
["花子", 14, 92],
["次郎", 16, 78]
]
# CSVファイルに書き込み
# newline="" を指定しないと、Windowsで余分な空行が入る
with open("students.csv", "w", encoding="utf-8", newline="") as file:
# csv.writer() でCSVライターを作成
writer = csv.writer(file)
# writerows() で複数行を一度に書き込み
writer.writerows(students)
print("CSVファイルを作成しました!")
実行結果
CSVファイルを作成しました!
💡 newline=”” について
Windowsでは、CSVファイルを書き込む時にnewline=""を指定しないと、
行と行の間に余分な空行が入ってしまいます。
必ず指定するようにしましょう。
📝 CSVファイルの読み込み
完成コード:CSVファイルを読み込む
※スマートフォンでは横スクロールできます
import csv
with open("students.csv", "r", encoding="utf-8") as file:
# csv.reader() でCSVリーダーを作成
reader = csv.reader(file)
# next() でヘッダー行を取得(最初の1行を読み飛ばす)
header = next(reader)
print(f"列: {header}")
# 残りの行をループで処理
print("\n=== 生徒データ ===")
for row in reader:
# row はリスト ["太郎", "15", "85"] の形式
name, age, score = row
print(f"{name}さん({age}歳): {score}点")
実行結果
列: ['名前', '年齢', '点数'] === 生徒データ === 太郎さん(15歳): 85点 花子さん(14歳): 92点 次郎さん(16歳): 78点
📝 辞書形式でCSVを読み込む(DictReader)
DictReaderを使うと、列名をキーとした辞書形式で読み込めます。
完成コード:辞書形式で読み込む
※スマートフォンでは横スクロールできます
import csv
with open("students.csv", "r", encoding="utf-8") as file:
# DictReader はヘッダーを自動的に読み取る
# 各行が辞書形式になる {"名前": "太郎", "年齢": "15", "点数": "85"}
reader = csv.DictReader(file)
print("=== 生徒データ(辞書形式) ===")
for row in reader:
# 列名で値にアクセスできる
print(f"{row['名前']}さん: {row['点数']}点")
実行結果
=== 生徒データ(辞書形式) === 太郎さん: 85点 花子さん: 92点 次郎さん: 78点
💡 DictReaderのメリット
・列名でデータにアクセスできるので分かりやすい
・列の順番が変わっても、名前で取得するので影響を受けない
・コードの可読性が上がる
📝 辞書形式でCSVを書き込む(DictWriter)
完成コード:辞書形式で書き込む
※スマートフォンでは横スクロールできます
import csv
# 辞書のリストでデータを用意
students = [
{"名前": "太郎", "年齢": 15, "点数": 85},
{"名前": "花子", "年齢": 14, "点数": 92},
{"名前": "次郎", "年齢": 16, "点数": 78}
]
with open("students.csv", "w", encoding="utf-8", newline="") as file:
# fieldnames で列名を指定
fieldnames = ["名前", "年齢", "点数"]
# DictWriter でCSVライターを作成
writer = csv.DictWriter(file, fieldnames=fieldnames)
# writeheader() でヘッダー行を書き込み
writer.writeheader()
# writerows() でデータを書き込み
writer.writerows(students)
print("CSVファイルを作成しました!")
実行結果
CSVファイルを作成しました!
📝 実践例:CSVから平均点を計算
完成コード:CSVデータの集計
※スマートフォンでは横スクロールできます
import csv
def calculate_stats(filename):
"""CSVファイルから統計情報を計算する関数"""
scores = []
with open(filename, "r", encoding="utf-8") as file:
reader = csv.DictReader(file)
for row in reader:
# 点数を整数に変換してリストに追加
scores.append(int(row["点数"]))
# 統計情報を計算
total = sum(scores)
average = total / len(scores)
max_score = max(scores)
min_score = min(scores)
print(f"=== 統計情報 ===")
print(f"人数: {len(scores)}人")
print(f"合計: {total}点")
print(f"平均: {average:.1f}点")
print(f"最高: {max_score}点")
print(f"最低: {min_score}点")
# 使用例
calculate_stats("students.csv")
実行結果
=== 統計情報 === 人数: 3人 合計: 255点 平均: 85.0点 最高: 92点 最低: 78点
📌 CSVモジュールのまとめ
| クラス/関数 | 用途 |
csv.reader() |
CSVを読み込む(リスト形式) |
csv.writer() |
CSVに書き込む(リスト形式) |
csv.DictReader() |
CSVを読み込む(辞書形式) |
csv.DictWriter() |
CSVに書き込む(辞書形式) |
🛡️ 8. エラー処理
ファイル操作では、「ファイルが見つからない」などのエラーが起きることがあります。エラー処理を入れておくと、プログラムが安全に動作します。
📝 ファイルが存在しない場合のエラー
完成コード:FileNotFoundError を処理
※スマートフォンでは横スクロールできます
try:
# 存在しないファイルを読み込もうとする
with open("存在しないファイル.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)
except FileNotFoundError:
# ファイルが見つからない場合の処理
print("エラー: ファイルが見つかりません")
実行結果
エラー: ファイルが見つかりません
📝 ファイルが存在するか確認してから読み込む
os.path.exists()を使うと、ファイルが存在するかを事前に確認できます。
完成コード:存在確認してから読み込む
※スマートフォンでは横スクロールできます
import os
def safe_read_file(filename):
"""安全にファイルを読み込む関数"""
# os.path.exists() でファイルの存在を確認
if not os.path.exists(filename):
print(f"エラー: {filename} が存在しません")
return None
try:
with open(filename, "r", encoding="utf-8") as file:
return file.read()
except Exception as e:
# その他のエラー(読み取り権限がない等)
print(f"エラー: {e}")
return None
# 使用例
content = safe_read_file("sample.txt")
if content:
print("=== ファイルの内容 ===")
print(content)
# 存在しないファイル
content = safe_read_file("存在しないファイル.txt")
実行結果(例)
=== ファイルの内容 === こんにちは! これはサンプルファイルです。 エラー: 存在しないファイル.txt が存在しません
📝 上書き防止機能を付ける
大切なファイルを間違って上書きしないように、確認機能を付けます。
完成コード:上書き確認
※スマートフォンでは横スクロールできます
import os
def safe_write_file(filename, content):
"""上書き確認付きで書き込む関数"""
# ファイルが既に存在する場合
if os.path.exists(filename):
answer = input(f"{filename} は既に存在します。上書きしますか? (y/n): ")
if answer.lower() != "y":
print("書き込みをキャンセルしました")
return False
with open(filename, "w", encoding="utf-8") as file:
file.write(content)
print(f"{filename} に書き込みました")
return True
# 使用例
safe_write_file("output.txt", "新しい内容です")
実行結果(例)
output.txt は既に存在します。上書きしますか? (y/n): y output.txt に書き込みました
📝 練習問題(10問)
ここまで学んだことを実際に手を動かして確認しましょう。
問題1:テキストファイルを読み込む(初級)
📋 問題
“test.txt”というファイルを読み込んで、内容を表示しましょう。(with文を使用)
解答を見る
コード
※スマートフォンでは横スクロールできます
with open("test.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)
問題2:ファイルに書き込む(初級)
📋 問題
“greeting.txt”というファイルを作成し、「こんにちは、世界!」と書き込みましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
with open("greeting.txt", "w", encoding="utf-8") as file:
file.write("こんにちは、世界!")
print("ファイルを作成しました!")
問題3:行数を数える(初級)
📋 問題
ファイルを読み込んで、何行あるかを表示しましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
with open("test.txt", "r", encoding="utf-8") as file:
lines = file.readlines()
print(f"行数: {len(lines)}")
問題4:番号付きで表示(中級)
📋 問題
ファイルを読み込んで、各行の先頭に行番号を付けて表示しましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
with open("test.txt", "r", encoding="utf-8") as file:
for i, line in enumerate(file, start=1):
print(f"{i}: {line.strip()}")
問題5:九九の表をファイルに保存(中級)
📋 問題
九九の表を”kuku.txt”というファイルに保存しましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
with open("kuku.txt", "w", encoding="utf-8") as file:
for i in range(1, 10):
for j in range(1, 10):
file.write(f"{i} × {j} = {i * j}\n")
file.write("\n") # 段の間に空行
print("九九の表を保存しました!")
問題6:単語を検索(中級)
📋 問題
ファイルを読み込んで、指定した単語が含まれる行を表示しましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
search_word = input("検索する単語: ")
with open("test.txt", "r", encoding="utf-8") as file:
found = False
for i, line in enumerate(file, start=1):
if search_word in line:
print(f"{i}: {line.strip()}")
found = True
if not found:
print("見つかりませんでした")
問題7:ファイルのバックアップ(中級)
📋 問題
ファイルを読み込んで、”元のファイル名_backup.txt”という名前でコピーを作成しましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
def backup_file(filename):
# 元のファイルを読み込む
with open(filename, "r", encoding="utf-8") as file:
content = file.read()
# バックアップファイル名を作成
backup_name = filename.replace(".txt", "_backup.txt")
# バックアップを保存
with open(backup_name, "w", encoding="utf-8") as file:
file.write(content)
print(f"バックアップを作成: {backup_name}")
backup_file("important.txt")
問題8:CSV成績表の作成(上級)
📋 問題
3人分の生徒の名前と点数を入力してもらい、CSVファイル”scores.csv”に保存しましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
import csv
students = []
for i in range(3):
name = input(f"{i+1}人目の名前: ")
score = int(input("点数: "))
students.append([name, score])
with open("scores.csv", "w", encoding="utf-8", newline="") as file:
writer = csv.writer(file)
writer.writerow(["名前", "点数"]) # ヘッダー
writer.writerows(students)
print("CSVファイルを作成しました!")
問題9:CSVから平均点を計算(上級)
📋 問題
成績のCSVファイルを読み込んで、平均点を計算しましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
import csv
total = 0
count = 0
with open("scores.csv", "r", encoding="utf-8") as file:
reader = csv.DictReader(file)
for row in reader:
score = int(row["点数"])
total += score
count += 1
average = total / count
print(f"平均点: {average:.1f}点")
問題10:ログ分析(上級)
📋 問題
ログファイルを読み込んで、「ERROR」という文字が含まれる行の数を数えましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
error_count = 0
with open("log.txt", "r", encoding="utf-8") as file:
for line in file:
if "ERROR" in line:
error_count += 1
print(line.strip())
print(f"\nエラー件数: {error_count}")
❓ よくある質問
Q1: なぜwith文を使うべき?
with文を使うと、ファイルを自動的に閉じてくれるので安全です。
close()を忘れたり、エラーが起きてもファイルが正しく閉じられます。
推奨:ファイル操作は必ずwith文を使いましょう!
Q2: encoding=”utf-8″は必要?
日本語を含むファイルを扱う時は必須です。
指定しないと文字化けする可能性があります。
英語のみのファイルでも、習慣として付けておくのがおすすめです。
Q3: 「w」モードで上書きを防ぐには?
方法1:os.path.exists()でファイルの存在を確認してから書き込む
方法2:「a」モード(追記)を使う
方法3:ユーザーに確認を求める(上書き確認)
Q4: CSVとテキストファイルの違いは?
・CSV:構造化されたデータ(表形式)を扱うのに適している
→ 名簿、成績表、商品リストなど
・テキストファイル:自由な形式のテキストに使う
→ ログ、メモ、設定ファイルなど
Q5: 大きなファイルを読み込むには?
read()で全部読むとメモリを大量に使います。
大きなファイルはfor文で1行ずつ読み込むと、メモリを節約できます。
with open("large.txt", "r", encoding="utf-8") as file:
for line in file:
# 1行ずつ処理
📌 ファイル操作のチェックリスト
| チェック項目 | 確認ポイント |
| with文を使っているか | 自動でファイルが閉じられる |
| encodingを指定しているか | 日本語の文字化けを防ぐ |
| 正しいモードを使っているか | r=読み込み、w=上書き、a=追記 |
| エラー処理を入れているか | ファイルが見つからない場合など |
| CSVはnewline=””を指定しているか | 余分な空行を防ぐ(Windows) |
🎉 ステップ20のまとめ
✅ このステップで学んだこと
✓ open():ファイルを開く(モード: r=読み込み、w=書き込み、a=追記)
✓ with文:安全なファイル操作(自動でclose)
✓ read():全体を読み込み、readline():1行ずつ、readlines():リストで取得
✓ write():書き込み、writelines():複数行を書き込み
✓ csvモジュール:CSVファイルの読み書き(reader/writer、DictReader/DictWriter)
✓ エラー処理:try-except、os.path.exists()で安全に操作
📌 このステップで学んだ主な関数・メソッド
| カテゴリ | 関数・メソッド |
| ファイルを開く | open(), with文 |
| 読み込み | read(), readline(), readlines() |
| 書き込み | write(), writelines() |
| CSV | csv.reader(), csv.writer(), csv.DictReader(), csv.DictWriter() |
| エラー処理 | try-except, os.path.exists() |
💪 次のステップへ
ファイルの読み書きをマスターしました!
これで、データを保存したり、外部ファイルからデータを読み込んだりできるようになりました。
次のステップでは、エラーと例外処理を学びます。
プログラムが予期しないエラーに遭遇した時の対処法をマスターしましょう!
学習メモ
Pythonプログラミング基礎 - Step 20