ステップ20:ファイルの読み書き

📄 ステップ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

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE