Pythonのファイル操作で自動化効率化を実現する実践テクニック

2025年4月27日日曜日

Python

Pythonのファイル操作、マスターすればプログラミングの世界がぐっと広がりますよ!

この記事では、パソコン上のファイルをPythonプログラムから読み込んだり、新しく書き込んだりする方法を、基本からちょっと応用的なテクニックまで、まるっと解説しちゃいます。


テキストファイルはもちろん、CSVファイルやJSONファイルみたいな、実用的なデータ形式の扱い方もバッチリ紹介。

面倒なファイル作業を自動化したり、データを効率よく扱ったりする第一歩、一緒に踏み出してみませんか?

この記事を読むと、次のようなことができるようになります!

  • ファイルの基本的な読み書きができるようになる
  • 安全にファイル操作を行う方法がわかる
  • テキストファイルの中身を自由自在に扱えるようになる
  • CSVファイルやJSONファイルといったデータ形式を扱えるようになる
  • フォルダ操作の基本がわかる
  • ファイル操作でよくあるエラーを防ぐ方法がわかる

Pythonのファイル操作入門

プログラミングをしていると、作ったデータや処理結果をどこかに保存したくなったり、逆に外部のデータを取り込んで処理したくなったりする場面が、しょっちゅう出てきます。

そんな時に活躍するのがファイル操作です!

例えば、こんな時にファイル操作が役立ちますよ。

  • Webサイトから集めた情報をパソコンに保存しておく
  • ゲームのセーブデータを読み書きする
  • たくさんのデータが入ったファイル(例えば、顧客リストとか)から必要な情報だけ抜き出す
  • プログラムの設定をファイルに書いておいて、起動時に読み込ませる
  • 毎日自動で動くプログラムの実行記録(ログ)を残す

ファイル操作ができるようになると、プログラムで扱えるデータの幅が格段に広がって、面倒な手作業を自動化したり、より複雑な処理を実現したりできるようになるんです。

まさに、Pythonプログラミングをレベルアップさせるための必須スキルと言っても過言ではありません!

Pythonのファイル操作の基礎 - `open`関数と`with`構文

さて、いよいよPythonでファイルを扱う方法を見ていきましょう。

ファイル操作の基本は、ファイルを「開いて」、中身を「読み書きして」、最後に「閉じる」という流れです。

料理で言うと、冷蔵庫を開けて、食材を取り出して、使い終わったらちゃんと閉める、みたいなイメージですね。

ファイルを閉じるのは結構大事で、閉め忘れるとデータがちゃんと保存されなかったり、他のプログラムから使えなくなったりすることがあるんです。

でも大丈夫!Pythonには、そんな閉め忘れを防いでくれる便利な仕組みもありますよ。

ファイルを開く読む書く閉じる基本の流れ

まずは、一番ベーシックなファイルの開閉と読み書きの方法です。

ファイルを開くには `open()` という関数を使います。
簡単なテキストファイル `sample.txt` を作って、そこに文字を書き込んで、そのあと読み込んでみましょう。

書き込みの例

# 'w' モードでファイルを開く(なければ新規作成、あれば上書き)
f = open('sample.txt', 'w', encoding='utf-8')

# ファイルに文字列を書き込む
f.write('こんにちは、Python!\n') # \n は改行
f.write('ファイル操作は楽しいね。')

# ファイルを閉じる(これを忘れない!)
f.close()

print('ファイルへの書き込みが完了しました。')

上のコードを実行すると、同じフォルダに `sample.txt` というファイルができて、中に文字が書き込まれます。

`encoding='utf-8'` は、日本語などの文字を正しく扱うためのおまじないだと思ってください。

次に、今作ったファイルを読み込んでみましょう。

読み込みの例

# 'r' モードでファイルを開く(読み込み専用)
f = open('sample.txt', 'r', encoding='utf-8')

# ファイルの内容をすべて読み込む
content = f.read()

# ファイルを閉じる
f.close()

# 読み込んだ内容を表示する
print('ファイルの内容')
print('---')
print(content)
print('---')
print('ファイルからの読み込みが完了しました。')

これを実行すると、さっき書き込んだ内容が画面に表示されるはずです。
ちゃんと `f.close()` でファイルを閉じている点に注目してくださいね。

でも、毎回 `close()` を書くのはちょっと面倒だし、忘れちゃうこともありますよね…?

そこで登場するのが、次の `with` 構文です! 実はこの`close()`忘れ、結構やりがちなミスなんです。だから`with`構文が推奨されていますよ。

安全確実 `with`構文のメリットと使い方

`with` 構文を使うと、ファイルを開いて処理を書くだけで、処理が終わったら自動的にファイルを閉じてくれるんです。超便利!

うっかり `close()` を書き忘れる心配がなくなるし、もし途中でエラーが起きても、ちゃんとファイルを閉じてくれるので安全です。

さっきの読み込み処理を `with` 構文で書き直してみましょう。

# 'with' を使ってファイルを開く
with open('sample.txt', 'r', encoding='utf-8') as f:
    # このブロック内でファイル操作を行う
    content = f.read()
    # ブロックを抜けたら自動で close() される

# 読み込んだ内容を表示する
print('ファイルの内容(with使用)')
print('---')
print(content)
print('---')
print('ファイルからの読み込みが完了しました。')

ほら、`f.close()` がなくなってスッキリしましたね!

`with open(...) as f:` と書くことで、`f` という名前でファイルが扱えるようになり、インデントされたブロック(字下げされた範囲)の処理が終わると、自動で後片付け(`close()`)をしてくれます。

これからは、特別な理由がない限り、ファイル操作は `with` 構文を使うのがおすすめです。絶対楽ですから!

読み書き追記バイナリ モード指定を理解する

`open()` 関数の2番目の引数(さっきの例だと `'r'` や `'w'`)は、ファイルを開く「モード」を指定します。

どんな目的でファイルを開くかによって、適切なモードを選ぶ必要があります。

よく使うモードをいくつか紹介しますね。

  • 'r' 読み込みモード(Read)
    ファイルの内容を読み込む時に使います。ファイルが存在しないとエラーになります。これが基本のモードです。
  • 'w' 書き込みモード(Write)
    ファイルに新しく書き込む時に使います。もし同じ名前のファイルが既にあれば、中身は全部消えて上書きされるので注意!ファイルがなければ新しく作られます。
  • 'a' 追記モード(Append)
    ファイルの一番最後に内容を付け足したい時に使います。ファイルがなければ新しく作られます。既存の内容を残したい場合は `w` ではなく `a` を使いましょう。
  • 'x' 新規作成書き込みモード(eXclusive creation)
    新しいファイルを作成して書き込みたい、でももし既にファイルがあったらエラーにしたい、という慎重派向けのモードです。
  • 'b' バイナリモード(Binary)
    テキストではなく、画像ファイルや音声ファイルのようなバイナリデータを扱う時に、他のモード(`r`, `w`, `a` など)と組み合わせて使います(例:`'rb'`, `'wb'`)。
  • '+' 更新モード(Plus)
    読み書き両方を行いたい時に、他のモードと組み合わせて使います(例:`'r+'`, `'w+'`, `'a+'`)。ちょっと複雑なので、慣れてから使うのがいいかも。

例えば、既存のファイルに1行だけ追加したいなら、こう書きます。

# 'a' モード(追記モード)でファイルを開く
with open('sample.txt', 'a', encoding='utf-8') as f:
    f.write('追記しました!\n')

print('ファイルへの追記が完了しました。')

# 確認のため読み込んでみる
with open('sample.txt', 'r', encoding='utf-8') as f:
    print('\n追記後のファイル内容')
    print('---')
    print(f.read())
    print('---')

これを実行すると、`sample.txt` の内容が消えずに、最後に「追記しました!」の行が追加されているはずです。

モードの使い分け、なんとなく分かりましたか?最初は `'r'`, `'w'`, `'a'` の3つを覚えておけば十分ですよ!

実践ファイル操作 - テキストCSV/JSONを扱う

基本的なファイル操作がわかったところで、次はもっと実践的なファイル形式を扱ってみましょう!

プログラムでよく使われるのは、普通のテキストファイルだけではありません。

カンマで区切られたデータが並ぶ「CSVファイル」や、Webの世界でよく使われる「JSONファイル」なども、Pythonなら簡単に扱えますよ。

テキストファイルの読み書き `read` `write`

まずは、テキストファイルの読み書きについて、もう少し詳しく見ていきましょう。

さっき `read()` を使ってファイル全体を読み込みましたが、他にも便利な読み込み方があります。

  • read() ファイル全体を一つの大きな文字列として読み込みます。小さなファイルなら簡単ですが、巨大なファイルだとメモリをたくさん使ってしまう可能性があります。
  • readline() ファイルを1行ずつ読み込みます。大きなファイルを少しずつ処理したい時に便利です。ファイルの最後まで読み込むと空文字列を返します。
  • readlines() ファイルの全行をリストとして読み込みます。各行の末尾には改行文字 `\n` が含まれます。一行ごとに何か処理をしたい時に便利です。

例えば、ファイルを1行ずつ読み込んで、行番号をつけて表示してみましょう。

# sample.txt を再度書き込みモードで開いて内容を準備
with open('sample.txt', 'w', encoding='utf-8') as f:
    f.write('1行目です。\n')
    f.write('2行目だよ。\n')
    f.write('これが3行目。\n')

print('ファイルの準備完了。\n')

# 1行ずつ読み込んで表示
line_number = 1
with open('sample.txt', 'r', encoding='utf-8') as f:
    print('readline() を使った読み込み')
    print('---')
    while True:
        line = f.readline() # 1行読み込む
        if not line: # 行がなくなったらループを抜ける
            break
        # strip()で行末の改行コードを取り除いて表示
        print(f'{line_number}: {line.strip()}')
        line_number += 1
    print('---')

# 全行をリストで読み込んで表示
with open('sample.txt', 'r', encoding='utf-8') as f:
    print('\nreadlines() を使った読み込み')
    print('---')
    lines = f.readlines() # 全行をリストで取得
    # enumerateを使うとインデックスと要素を同時に取得できる
    for i, line in enumerate(lines):
        print(f'{i+1}: {line.strip()}')
    print('---')

実行すると、それぞれの方法でファイルの内容が読み込まれ、行番号付きで表示されるのが確認できます。

どの読み込み方が適切かは、ファイルの内容やサイズ、やりたい処理によって変わってくるので、使い分けられるようにしておくと良いですね。

書き込みについては、文字列を書き込む `write()` が基本です。

もし、リストに入っている複数の文字列を書き込みたい場合は `writelines()` も使えますが、こちらは改行を自動で入れてくれない点に注意が必要です。結局 `write()` をループで使うことの方が多いかもしれません。

CSVファイルの読み書き `csv`モジュール活用術

CSV(Comma Separated Values)ファイルは、データをカンマ(,)で区切って保存する、とってもシンプルな形式です。

Excelなどの表計算ソフトでもよく使われますよね。
Pythonには、このCSVファイルを簡単に扱うための `csv` モジュールが用意されています。

例えば、こんなデータがあったとします。(下の内容を`data.csv`として保存してください)

名前,年齢,好きな食べ物
太郎,25,ラーメン
花子,30,寿司
次郎,22,カレー

このCSVファイルを読み込んで、内容を表示するプログラムはこう書けます。

import csv # csvモジュールをインポート

# CSVファイルを読み込みモードで開く
# newline='' はおまじない。CSVを正しく扱うために指定します。
try:
    with open('data.csv', 'r', encoding='utf-8', newline='') as f:
        # CSVリーダーオブジェクトを作成
        reader = csv.reader(f)

        # ヘッダー行(最初の行)を読み飛ばす(必要なら)
        header = next(reader)
        print(f'ヘッダー: {header}')
        print('---')

        # 1行ずつ読み込んで表示
        print('データ内容:')
        for row in reader:
            # row は各行のデータがリストになったもの
            # 例: ['太郎', '25', 'ラーメン']
            if len(row) == 3: # データが3つ揃っているか念のため確認
                name = row[0]
                age = row[1]
                food = row[2]
                print(f'名前: {name}, 年齢: {age}, 好きな食べ物: {food}')
            else:
                print(f'不正な行データ: {row}')
        print('---')
        print('CSVファイルの読み込み完了。')

except FileNotFoundError:
    print('エラー: data.csv が見つかりません。ファイルを作成して中身を記述してください。')
except Exception as e:
    print(f'エラーが発生しました: {e}')

`csv.reader()` を使うと、ファイルオブジェクトを渡すだけで、CSVの1行をリストとして簡単に取得できます。

`newline=''` の指定は、異なるOS間での改行コードの違いによる問題を避けるために推奨されています。忘れると思わぬ空行が入ることがありますよ。

逆に、PythonのリストデータをCSVファイルに書き込むには `csv.writer()` を使います。

import csv

# 書き込むデータ(リストのリスト)
new_data = [
    ['名前', 'スコア'],
    ['三郎', '85'],
    ['四葉', '92']
]

# CSVファイルを書き込みモードで開く
try:
    with open('scores.csv', 'w', encoding='utf-8', newline='') as f:
        # CSVライターオブジェクトを作成
        writer = csv.writer(f)

        # writerows()で複数行を一気に書き込む
        writer.writerows(new_data)

        # 1行ずつ書き込む場合は writerow() を使う
        # writer.writerow(['五郎', '78'])

    print('CSVファイルへの書き込み完了。 scores.csv を確認してください。')
except Exception as e:
    print(f'エラーが発生しました: {e}')

`csv.writer()` でライターを作り、`writerow()`(1行書き込み)や `writerows()`(複数行書き込み)メソッドでデータを与えればOKです。

`csv` モジュールを使えば、面倒なカンマ処理やクォーテーション処理を気にせず、簡単にCSVを扱えますね!

JSONデータの読み書き `json`モジュール活用術

JSON(JavaScript Object Notation)は、Web APIなどでデータのやり取りをする際によく使われる形式です。

Pythonの辞書(キーと値のペア)やリストと非常に相性が良く、簡単に相互変換できます。
Pythonには、JSONを扱うための `json` モジュールが標準で用意されています。

例えば、こんなJSONデータがあるとします。(下の内容を `user.json` として保存してください)

{
    "user_id": 123,
    "name": "権兵衛",
    "email": "gonbei@example.com",
    "tags": ["Python", "データ処理", "初心者"]
}

このJSONファイルを読み込んで、Pythonの辞書として扱うコードはこうです。

import json # jsonモジュールをインポート

try:
    # JSONファイルを読み込みモードで開く
    with open('user.json', 'r', encoding='utf-8') as f:
        # json.load() でファイルからJSONデータを読み込み、Pythonの辞書に変換
        user_data = json.load(f)

    # 読み込んだデータを表示(辞書になっていることを確認)
    print('読み込んだJSONデータ(Python辞書):')
    print(user_data)
    print('---')

    # 辞書のキーを使って値にアクセス
    print(f'ユーザー名: {user_data["name"]}')
    print(f'最初のタグ: {user_data["tags"][0]}')
    print('---')
    print('JSONファイルの読み込み完了。')

except FileNotFoundError:
    print('エラー: user.json が見つかりません。ファイルを作成して中身を記述してください。')
except json.JSONDecodeError:
    print('エラー: user.json の内容が正しいJSON形式ではありません。')
except Exception as e:
    print(f'エラーが発生しました: {e}')

`json.load()` を使うだけで、ファイルの中身がPythonの辞書 `user_data` に変換されました!簡単すぎますね。

これで、あとは普通の辞書やリストと同じようにデータにアクセスできます。

逆に、Pythonの辞書やリストをJSONファイルとして保存するには `json.dump()` を使います。

import json

# 書き込むデータ(Pythonの辞書)
product_info = {
    "product_id": "ABC-001",
    "name": "すごいキーボード",
    "price": 15000,
    "in_stock": True,
    "specs": {
        "layout": "JIS",
        "type": "メカニカル"
    }
}

try:
    # JSONファイルを書き込みモードで開く
    with open('product.json', 'w', encoding='utf-8') as f:
        # json.dump() でPythonオブジェクトをJSON形式でファイルに書き込む
        # indent=4 は人間が読みやすいようにインデント(字下げ)を指定
        # ensure_ascii=False は日本語などをそのまま出力するために指定
        json.dump(product_info, f, indent=4, ensure_ascii=False)

    print('JSONファイルへの書き込み完了。 product.json を確認してください。')

except Exception as e:
    print(f'エラーが発生しました: {e}')

`json.dump()` の引数で、`indent=4` を指定すると整形されて見やすくなり、`ensure_ascii=False` を指定すると日本語がそのまま書き込めるので、覚えておくと便利です。

Web系の開発やデータ連携などでJSONは頻繁に登場するので、`json` モジュールの使い方はぜひマスターしておきましょう!

ちなみに、ファイルではなく、単なる文字列としてのJSONデータを扱いたい場合は `json.loads()` (文字列からPythonオブジェクトへ) と `json.dumps()` (Pythonオブジェクトから文字列へ) を使います。

名前が似てるので間違えないように! `s` がつく方は文字列(String)用、と覚えるといいかも。

ディレクトリ操作と注意点 - Pythonファイル操作を極める

ファイルの中身だけでなく、ファイルが置いてある場所、つまりディレクトリ(フォルダ)そのものを操作したい場面も出てきます。

例えば、特定のフォルダの中に新しいフォルダを作ったり、フォルダ内のファイル一覧を取得したり、ファイルやフォルダを移動・削除したり、といった具合です。

また、ファイル操作には、文字化けや予期せぬエラーなど、注意すべき点もいくつかあります。ここでは、そうした応用的な操作と注意点について解説します。

ファイルやフォルダを自在に操る `os`と`pathlib`

Pythonでファイルパスを扱ったり、ディレクトリを操作したりするには、主に `os` モジュールと `pathlib` モジュールが使われます。

  • os モジュール: 昔からあるモジュールで、ファイルシステムに関する様々な機能を提供します。特に `os.path` サブモジュールがパス操作によく使われます。
  • pathlib モジュール: Python 3.4から導入された比較的新しいモジュールで、パスをオブジェクトとして扱えるため、より直感的でコードが書きやすいと評判です。今から学ぶなら、`pathlib` を中心に使うのがおすすめです。コードがスッキリしますよ!

いくつか、よく使う操作を `pathlib` で見てみましょう。

from pathlib import Path # pathlib から Path クラスをインポート
import shutil # 高レベルなファイル操作(ディレクトリ削除など)のため

# 1. 現在の作業ディレクトリを取得
current_dir = Path.cwd() # cwd = current working directory
print(f'現在のディレクトリ: {current_dir}')

# 2. 新しいディレクトリを作成
new_dir = current_dir / 'my_folder' # / 演算子でパスを結合できる!
# exist_ok=True は、もし既にフォルダがあってもエラーにしないオプション
try:
    new_dir.mkdir(exist_ok=True)
    print(f'作成した(または既に存在する)ディレクトリ: {new_dir}')

    # 3. ファイルパスを作成し、簡単なテキストファイルを作成
    file_path = new_dir / 'my_file.txt'
    file_path.write_text('pathlib 便利!', encoding='utf-8')
    print(f'作成したファイル: {file_path}')

    # 4. ディレクトリ内のファイルやフォルダの一覧を取得
    print(f'\n{new_dir} の中身:')
    items_in_dir = list(new_dir.iterdir()) # 一度リストに変換して内容を確認
    if not items_in_dir:
        print('- 中身は空です')
    else:
        for item in items_in_dir:
            item_type = 'ファイル' if item.is_file() else 'ディレクトリ'
            print(f'- {item.name} ({item_type})')

    # 5. ファイルが存在するか確認
    print(f'\n{file_path.name} は存在するか? {file_path.exists()}')
    temp_file = new_dir / 'temp.txt'
    print(f'{temp_file.name} は存在するか? {temp_file.exists()}')

    # 6. ファイル名を変更(移動)
    new_file_path = new_dir / 'renamed_file.txt'
    # リネーム先にファイルが存在しないことを確認
    if file_path.exists() and not new_file_path.exists():
        file_path.rename(new_file_path)
        print(f'\n{file_path.name} を {new_file_path.name} に変更しました。')
        print(f'変更後のパス: {new_file_path}')
        file_path = new_file_path # パス変数を更新
    elif new_file_path.exists():
        print(f'\nリネーム先 {new_file_path.name} が既に存在するため、リネームしませんでした。')
        file_path = new_file_path # 既存のファイルを使うためパスを更新
    else:
        print(f'\n元のファイル {file_path.name} が存在しないため、リネームできませんでした。')


    # 7. ファイルを削除
    # (注意: 削除は元に戻せないので、実行前に確認を!)
    if file_path.exists():
        file_path.unlink() # ファイル削除を実行
        print(f'\n{file_path.name} を削除しました。')
    else:
         print(f'\n{file_path.name} は存在しないため削除できません。')


    # 8. ディレクトリを削除 (中身が空である必要がある場合: rmdir)
    # (注意: 削除は元に戻せないので、実行前に確認を!)
    # 中身が空かチェック
    is_empty = not any(new_dir.iterdir())
    if is_empty:
        new_dir.rmdir() # ディレクトリ削除を実行
        print(f'\n{new_dir.name} を削除しました。(rmdir)')
    else:
        print(f'\n{new_dir.name} は空ではないため、rmdir() で削除できません。')
        # 中身ごと削除したい場合は shutil.rmtree を使う(さらに注意が必要!)
        # print(f'{new_dir.name} を中身ごと削除します。(shutil.rmtree)')
        # shutil.rmtree(new_dir) # この行を実行するとフォルダごと消えるので本当に注意!

except Exception as e:
    print(f'\nディレクトリ操作中にエラーが発生しました: {e}')

実行結果の例 (環境によってパスは異なります。また、実行タイミングによって削除されるかどうかが変わります):

現在のディレクトリ: /Users/your_username/some_folder
作成した(または既に存在する)ディレクトリ: /Users/your_username/some_folder/my_folder
作成したファイル: /Users/your_username/some_folder/my_folder/my_file.txt

my_folder の中身:
- my_file.txt (ファイル)

my_file.txt は存在するか? True
temp.txt は存在するか? False

my_file.txt を renamed_file.txt に変更しました。
変更後のパス: /Users/your_username/some_folder/my_folder/renamed_file.txt

renamed_file.txt を削除しました。

my_folder を削除しました。(rmdir)

`pathlib` を使うと、パスの結合が `/` でできたり、ファイルやディレクトリの操作がオブジェクトのメソッドとして呼び出せたりして、コードが読みやすくなりますね。

ディレクトリを中身ごと消したい場合は `shutil.rmtree()` という強力な命令もありますが、間違って使うと大変なことになるので、使うときは十分すぎるほど注意してください!

よくあるエラー 文字コードと例外処理 `try-except`

ファイル操作をしていると、残念ながらエラーに遭遇することもあります。

特に初心者がつまずきやすいのが「文字コード」の問題と、「ファイルが見つからない」といった予期せぬ事態です。

でも大丈夫、原因と対策を知っておけば怖くありません!

文字コードの問題 (UnicodeDecodeError など)

プログラムがファイルの文字を読み込もうとした時に、そのファイルがどんなルール(エンコーディング)で書かれているか正しく理解できないと、文字化けしたり `UnicodeDecodeError` というエラーが出たりします。

対策は、`open()` 関数で `encoding` を指定することです。

# Shift_JISで保存されたファイル(legacy_data.txt) を用意する想定
# (Windowsのメモ帳などで Shift_JIS を選んで保存)
# 例: legacy_data.txt の中身 -> こんにちは Shift_JIS

file_name = 'legacy_data.txt'

try:
    # UTF-8で読み込もうとするとエラーになる可能性がある
    print('--- UTF-8で読み込み試行 ---')
    with open(file_name, 'r', encoding='utf-8') as f:
         content_utf8 = f.read()
         print(content_utf8)

except UnicodeDecodeError as e:
    print(f'やっぱり!UTF-8では読めませんでした: {e}')
    # エラーが出たら Shift_JIS (cp932) で再試行
    print('\n--- Shift_JIS (cp932) で再試行 ---')
    try:
        with open(file_name, 'r', encoding='cp932') as f:
            content_cp932 = f.read()
            print('Shift_JISでの読み込み成功:')
            print(content_cp932)
    except Exception as e_inner:
        print(f'Shift_JISでも読めませんでした: {e_inner}')
except FileNotFoundError:
    print(f'エラー: {file_name} が見つかりません。用意してください。')
except Exception as e_outer:
    print(f'予期せぬエラーが発生しました: {e_outer}')

日本のWindows環境で作られた古いテキストファイルなどは `Shift_JIS` (Pythonでは `cp932` と書くことが多い) で保存されている場合があります。最近のシステムでは `UTF-8` が主流です。

ファイルを開くときは、可能な限り `encoding='utf-8'` を指定し、もしそれでエラーが出る場合は、ファイルの実際のエンコーディングを調べて指定し直しましょう。`try-except` を使えば、エラー時に別のエンコーディングで試す、といった処理も書けますね。

ファイルが見つからないなどのエラー (FileNotFoundError など) と例外処理

読み込もうとしたファイルが存在しなかったり、書き込もうとした場所に権限がなかったりすると、エラーでプログラムが止まってしまいます。

これを防ぐために使うのが `try-except` 構文(例外処理)です。

`try:` のブロックにエラーが起こる可能性のある処理を書き、`except エラーの種類:` のブロックに、もしそのエラーが起こったら実行したい処理を書きます。

file_to_read = 'non_existent_file.txt' # 存在しないファイル名

try:
    # 存在しないファイルを開こうとすると FileNotFoundError が発生する
    print(f'ファイル {file_to_read} を開こうとしています...')
    with open(file_to_read, 'r', encoding='utf-8') as f:
        content = f.read()
        print(content)
    print(f'{file_to_read} の読み込み成功!') # ここは実行されない

except FileNotFoundError:
    # FileNotFoundError が発生した場合に、このブロックが実行される
    print(f'おっと!ファイル {file_to_read} が見つかりませんでした。')
    print('代わりにデフォルト設定を使います(などの代替処理)')
except PermissionError:
    # 書き込み権限がない場合など
    print(f'エラー: {file_to_read} へのアクセス権限がありません。')
except Exception as e:
    # 予期しないその他のエラーが発生した場合 (念のため)
    print(f'何か別のエラーが起きました: {e}')
finally:
    # エラーがあってもなくても、最後に必ず実行される処理 (任意)
    print('ファイル読み込み処理(またはエラー処理)が完了しました。')


print('\nプログラムはエラーで停止せずに、ここまで実行されました。')

これを実行すると、ファイルが見つからないので `except FileNotFoundError:` のブロックが実行され、「おっと!ファイル...」というメッセージが表示されますが、プログラム自体は最後まで実行されます。

`try-except` を使うことで、予期せぬエラーが起きてもプログラム全体が止まるのを防ぎ、より安定したプログラムを作ることができます。

ファイル操作に限らず、エラーが起こりそうな箇所では積極的に使っていきたい構文です。`finally` 節を使うと、エラーの有無に関わらず後片付け処理などを書けて便利ですよ。

【まとめ】Pythonのファイル操作をマスターしよう

この記事では、Pythonを使ったファイル操作の基本から応用まで、一通り見てきました。

ポイントを振り返ってみましょう。

  • ファイル操作の基本は `open()` で開き、`with` 構文を使うのが安全で楽ちん。
  • `'r'`, `'w'`, `'a'` などのモード指定で読み書き追記を使い分ける。
  • テキストファイルは `read()`, `readline()`, `readlines()` で読み込み、`write()` で書き込む。
  • CSVファイルは `csv` モジュールで簡単に読み書きできる。
  • JSONファイルは `json` モジュールでPythonの辞書やリストと相互変換できる。
  • ディレクトリ操作には `pathlib` モジュールが直感的で便利。
  • 文字コードエラーには `encoding` 指定、予期せぬエラーには `try-except` で備える。

ファイル操作をマスターすれば、データを永続的に保存したり、他のプログラムやサービスとデータを連携したり、日常の定型作業を自動化したりと、Pythonでできることの幅がぐんと広がります。

最初は難しく感じるかもしれませんが、実際にコードを書いて動かしてみるのが一番の近道です!

さあ、今日学んだことを活かして、次はどんなプログラムを作ってみますか?
例えば…

  • お気に入りのWebサイトの情報を定期的に取得してファイルに保存するスクリプト
  • フォルダ内の画像ファイルの名前を一括で変更するツール
  • 簡単な日記やメモをテキストファイルに記録するプログラム
  • CSV形式の住所録データを読み込んで整理するプログラム

アイデアは無限大です!ぜひ、楽しみながらファイル操作のスキルを磨いていってくださいね。

【関連記事】 「Pythonとは?」に答える最初の一歩

このブログを検索

  • ()

自己紹介

自分の写真
リモートワークでエンジニア兼Webディレクターとして活動しています。プログラミングやAIなど、日々の業務や学びの中で得た知識や気づきをわかりやすく発信し、これからITスキルを身につけたい人にも役立つ情報をお届けします。 note → https://note.com/yurufuri X → https://x.com/mnao111

QooQ