用語比較
with文とopen()・close()の違い(ファイルを閉じる書き方)
with文とopen()・close()の違いは、ファイルを閉じる処理を誰が行うかです。with文は、ブロックが終わるとファイルが閉じられます。close()を自分で呼ぶ書き方は、呼び忘れるとファイルが開いたままになります。
Python 3 エンジニア認定基礎試験は、オライリー・ジャパン「Pythonチュートリアル」の掲載内容を出題範囲としています。ファイルの扱いは第7章入出力(40問中1問)、with文のクリーンアップ動作は第8章エラーと例外(40問中4問)に関わります(2026-10-17確認)。
このページは、with文を使う理由を選択肢で問われて、close()との関係を言い分けられない人を対象にしています。同じ処理を2通りで書き、実行結果で並べます。
この記事の目次
この記事の根拠と出典
各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。Python3エンジニア認定基礎試験の一次情報確認日: 2026-09-18。
- 公式一次資料と照合した内容
- with キーワードの利点、f.close() を呼ぶ場合、閉じたあとの操作が失敗することは Python公式チュートリアル7.2を、with文によるクリーンアップは同8.7を、出題範囲と第7章・第8章の出題数はPythonエンジニア育成推進協会の試験案内を2026-10-17に照合しています。コード例の出力はPython 3.9で実際に実行して確かめています。
- 編集部が学習用に整理した内容
- 閉じる処理の主語と例外の有無から書き方を選び分ける手順と、確認問題は編集部の学習上の整理です。
資格ごとの公式資料の一覧
結論
公式一次資料と照合:用語の定義は公式一次資料と照合しています。
with文
with open(...) as f: のブロックが終わると、ファイルが自動で閉じられる。ブロックの途中で例外が起きても閉じられる。
open()とclose()
open() でファイルを開き、使い終わったら f.close() を自分で呼ぶ。呼ばなければ、開いたままになる。
違いを表で確認
| 比較軸 | with文 | open()とclose() |
|---|---|---|
| 閉じる処理を行う人 | Python(ブロックの終わりで自動) | 自分(f.close() を書く) |
| ブロックの途中で例外が起きたとき | ファイルは閉じられる | close() を try-finally の中に書かない限り、閉じられないことがある |
| f.closed の値 | ブロックを抜けたあとは True | close() を呼ぶまでは False |
| 閉じたあとに f.read() を呼ぶと | ValueError: I/O operation on closed file. | 同じ ValueError |
| 選択肢で探す語 | 自動で閉じる、例外が起きても閉じる、短く書ける | 明示的に閉じる、呼び忘れ、資源の解放 |
公式一次資料と照合:Python3エンジニア認定基礎試験: 2026-09-18に一次資料で確認一次資料の一覧を見る →
Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)
試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。
どこで迷っているかを切り分ける
with文を使う理由を「短く書けるから」としか言えない人
公式チュートリアルは、with を使う利点を、スイートが終わったあとに、途中で例外が起きていてもファイルが正しく閉じられることとしています。try-finally で同じことを書くより短い、という点は付け足しです。
close() を呼べば with 文と同じだと考える人
close() を呼べば閉じられますが、close() の前に例外が起きると、その行まで届きません。with文は、例外が起きても閉じます。
with ブロックの外でファイルを読もうとする人
with ブロックを抜けると、ファイルは閉じられています。閉じたファイルを使うと ValueError になります。読む処理は with の中に書きます。
具体例で使い分ける
編集部の整理
例 1
同じファイルを with と close() で開く
1行 "one" を書いたファイルを、with文で読む場合と、open() のあとに close() を呼ぶ場合を比べる場面です。
- Python 3.9 で実際に実行すると、with open(path) as g: のブロックの中では g.closed は False で、ブロックを抜けたあとは True でした。
- open() で開いたファイルは、f.close() を呼ぶ前は f.closed が False で、呼んだあとは True でした。
結論: with文は、ブロックを抜ける時点で閉じます。close() は、呼んだ時点で閉じます。
例 2
ブロックの途中で例外が起きたとき
ファイルを開いたあと、読む前に RuntimeError が起きる場面です。
- with open(path) as h: の中で RuntimeError を起こして except で受けたあと、h.closed は True でした。
- open() で開いて close() を呼ばないまま RuntimeError を except で受けた場合、f2.closed は False でした。
- 公式チュートリアルは、for line in open("myfile.txt") のような書き方では、コードの実行が終わったあとも不定の時間ファイルが開いたままになりうると述べ、with文は、ファイルのようなオブジェクトが常に即座に正しくクリーンアップされることを保証すると説明しています(第8章 定義済みクリーンアップ処理)。
結論: 例外が起きても閉じるのは with文です。close() だけに頼ると、閉じられない場合が生じます。
例 3
閉じたあとに読む
with ブロックを抜けたあとで、同じファイルオブジェクトの read() を呼ぶ場面です。
- 実際に実行すると、g.read() は ValueError: I/O operation on closed file. を発生させました。
- 公式チュートリアルは、with文でも f.close() でも、閉じたあとにファイルオブジェクトを使おうとすると自動的に失敗すると述べています。
結論: 閉じ方がどちらでも、閉じたあとは読めません。違いは、閉じる処理が確実に行われるかどうかです。
問題文から答えを選ぶ手順
編集部の整理:閉じる処理の主語と例外の有無から書き方を選び分ける手順と、確認問題は編集部の学習上の整理です。
- 1
閉じる処理の主語を見る
「自動で」「ブロックを抜けると」なら with文、「f.close() を呼ぶ」なら open() と close() の書き方です。
- 2
例外が出てくるかを見る
「例外が起きても閉じる」とあれば with文です。close() だけでは、その保証がありません。
- 3
閉じたあとの操作を確認する
どちらの書き方でも、閉じたあとの read() は ValueError です。
- 4
書き込みなら特に確認する
公式チュートリアルは、with も close() も使わずに f.write() を呼ぶと、引数が完全にはディスクへ書かれないことがあると警告しています。
試験での見分け方
編集部の整理
- 1ファイルを扱うときは with キーワードを使うのがよい習慣である(公式チュートリアルの記述)。
- 2with文は、スイートが終わったあと、途中で例外が起きていてもファイルを閉じる。
- 3with を使わない場合は、f.close() を呼んで、システム資源をすぐ解放する。
- 4with文でも f.close() でも、閉じたあとのファイルオブジェクトを使うと失敗する。
誤答しやすい選択肢
with文を抜けたあともファイルが開いていると考える
修正: ブロックを抜けると f.closed は True になります。実行確認でも True でした。
close() を書けば例外が起きても必ず閉じると考える
修正: close() の前に例外が起きると、その行に届きません。実行確認でも、close() を呼ばない道筋では f2.closed が False のままでした。
with文の中でファイルを閉じてはいけないと考える
修正: with は、ブロックの終わりで閉じる仕組みです。ブロックの外で読もうとすると ValueError になる点だけ押さえます。
閉じたファイルを読むと空文字列が返ると考える
修正: 空文字列は、末尾に達したときの結果です。閉じたファイルを読むと ValueError になります。
確認問題
Q1with open("a.txt") as f: のブロックを抜けた直後の f.closed の値は?
答え: True
with文は、ブロックが終わるとファイルを閉じます。途中で例外が起きても同じです。
Q2with文を使う利点として、公式チュートリアルが挙げているのは?
答え: 途中で例外が起きても、スイートが終わったあとにファイルが正しく閉じられること
try-finally で同じことを書くより短くなる、という点も述べています。
Q3閉じたファイルに対して f.read() を呼ぶと、何が起きる?
答え: ValueError(I/O operation on closed file.)
with文で閉じた場合も、f.close() で閉じた場合も同じです。
到達チェック
- with文を抜けたあとのファイルの状態を言える
- 例外が起きたときの with文と close() の違いを説明できる
- 閉じたファイルを読んだときの結果を言える
- with を使わないときに close() が必要な理由を説明できる
関連ページで確認する
同じ資格で次に知りたいこと
- lambda式とdef関数の違い(単一の式・名前・return)
lambda式とdef関数の違いを、単一の式という制限、関数名、return の書き方、list.sort() の key への渡し方、Python 3.9 で実際に実行した出力、Python3エンジニア認定基礎試験での判断手順と確認問題まで解説します。
- 辞書の d[key] と d.get(key) の違い(KeyError の扱い)
辞書の d[key] と d.get(key) の違いを、キーが存在しないときの KeyError と None、既定値の指定、Python 3.9 で実際に実行した出力、Python3エンジニア認定基礎試験での判断手順と確認問題まで解説します。
- 辞書内包表記とリスト内包表記の違い(Python 3 エンジニア認定基礎試験)
辞書内包表記とリスト内包表記の違いを、括弧とキー:値の書き方、結果の型、キーの条件、Python 3 エンジニア認定基礎試験での読み取り手順と確認問題まで、公式チュートリアルに沿って解説します。
よくある質問
Qwith文とclose()の一番短い違いは?
with文はブロックの終わりで自動的に閉じ、途中で例外が起きても閉じます。close() は自分で呼ぶ必要があります。
Qwith文を使えば close() は不要ですか?
不要です。公式チュートリアルは、with を使わない場合に f.close() を呼ぶよう述べています。
Qwith文はファイル以外にも使えますか?
公式チュートリアルは、ファイルなど定義済みのクリーンアップ処理を持つオブジェクトについては、それぞれのドキュメントで示されると述べています。
QPython3エンジニア認定基礎試験の範囲ですか?
出題範囲はPythonチュートリアルで、第7章入出力が40問中1問、第8章エラーと例外が4問です(2026-10-17確認)。公式チュートリアル7.2が with の利点を、8.7が定義済みクリーンアップ処理を説明しています。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: ミナト編集部(運営者情報を見る)
