第7章 入出力(40問中1問)
Python3基礎試験の入出力:open()・readline()・json
第7章の入出力は、ファイルを開くときのモードと、読み取りの結果を取り違えないかが問われます。このページでは、f-stringとformat()の書き方、open()のモード、readline()の戻り値、with文、jsonでの保存と読み込みを、Python 3.9.6で実際に実行した結果で確かめます。覚えるのは3つです。'w' は既存の中身を消す、readline() の空文字はファイルの終端、with を使えば例外が起きても閉じます。
このページは試験の学習用の整理です。公式の問題は転載せず、コードはすべて説明用に作った例です。表の中の p は、書き込みと読み取りに使う一時ファイルの場所を指します。
この記事の目次
公式情報の確認
試験日、料金、申込条件、試験方式など変動する情報は、公式情報を最終確認してください。 当サイトの一次情報確認日: 2026-09-18。
試験の出題範囲・実施要項は変動するため、受験前に公式情報を確認してください。
結論
- open() のモードは、'r' が読み出し専用(省略時もこれ)、'w' が書き込み専用で既存を消去、'a' が末尾に追記、'r+' が読み書き両用。'b' を付けるとバイナリモードで bytes を読み書きする
- readline() は改行文字を文字列の終端に残し、ファイルの終端に達すると空の文字列を返す。空行は '\n' なので区別できる
- with を使うと、処理中に例外が起きてもファイルが閉じられる。with も close() も使わないと、書き込みが完全に保存されないことがある
- f-string は波括弧の中に式を書き、format() は波括弧の中の数字が引数の位置、名前がキーワード引数。json は dumps() が文字列、dump() がファイルへの書き込み、load() がファイルからの読み込み
f-stringとformat()の書き方
公式チュートリアルによると、フォーマット済み文字列リテラル(f-string)は、文字列の先頭に f を付け、{ と } の間に Python の式を書けます。式の後ろにオプションのフォーマット指定子を付けると、値のフォーマット方式を制御できます。str.format() メソッドでは、波括弧内の数字が format() に渡した引数の位置を指し、キーワード引数が渡された場合は引数の名前で参照されます。
| コード | 実行結果 | ひとこと |
|---|---|---|
year = 2016
event = '国民投票'
f'{year}年の{event}の結果' | '2016年の国民投票の結果' | { } の中の式が評価されて文字列に入る |
import math
f'{math.pi:.3f}' | '3.142' | 式のあとに : とフォーマット指定子を付けると、桁数などを指定できる |
'{1} and {0}'.format('spam', 'eggs') | 'eggs and spam' | format() の { } の中の数字は、渡した引数の位置 |
'This {food} is {adjective}.'.format(
food='spam', adjective='absolutely horrible') | 'This spam is absolutely horrible.' | キーワード引数は名前で参照される |
f-string は式を直接書き、format() は渡した引数を位置か名前で指します。'{1} and {0}' は 1 番目の引数 eggs が先に入るので、結果は eggs and spam になります。
open()のモード
公式チュートリアルによると、open() の mode は、ファイルが読み出し専用なら 'r'、書き込み専用なら 'w' とします。'w' は同名の既存のファイルがあれば消去されます。'a' はファイルを追記用に開き、書き込まれた内容は自動的にファイルの終端に追加されます。'r+' はファイルを読み書き両用に開き、mode を省略した場合は 'r' と仮定されます。モードに 'b' を追加するとバイナリモードで開き、データを bytes オブジェクトとして読み書きします。
| コード | 実行結果 | ひとこと |
|---|---|---|
with open(p, 'w', encoding='utf-8') as g:
g.write('ab')
with open(p, 'rb') as g:
g.read() | b'ab' | 'b' を付けるとバイナリモードで、bytes として読み書きする |
with open(p, 'w', encoding='utf-8') as g:
pass
with open(p, 'rb') as g:
g.read() | b'' | 'w' で開くと既存の中身は消える。書かずに閉じると空のファイルになる |
with open(p, 'a', encoding='utf-8') as g:
g.write('\nfourth') | (エラーなし) | 'a' は既存の内容の終端に追記する。消えない |
with open(p, 'r', encoding='utf-8') as g:
g.write('x') | UnsupportedOperation: not writable | 'r' は読み出し専用なので、書き込むとエラー |
open('none_dir/x.txt') | FileNotFoundError | 'r' で存在しないファイルを開くとエラー |
'w' は開いた時点で中身が消えます。書き込む内容が何もなくても、既存の内容は残りません。残したまま足したいときは 'a' を使います。テキストモードでは encoding も指定でき、公式チュートリアルは、指定しない場合の既定を UTF-8 と説明しています。
readline()と行ごとの読み取り
公式チュートリアルによると、f.readline() はファイルから 1 行だけを読み取り、改行文字(\n)は読み出された文字列の終端に残ります。改行が省略されるのは、ファイルが改行で終わっていない場合の最終行のみです。f.readline() が空の文字列を返したら、ファイルの終端に達したことが分かります。ファイルのすべての行をリストで読み取りたいなら、list(f) や f.readlines() を使います。
| コード | 実行結果 | ひとこと |
|---|---|---|
f = open(p, encoding='utf-8')
f.readline() | 'first line\n' | 1行だけ読み、改行文字が文字列の終端に残る |
f.readline() | 'second line\n' | 続けて呼ぶと次の行 |
f.readline() | 'third' | 改行で終わらない最終行は、改行が付かない |
f.readline() | '' | ファイルの終端に達すると空の文字列 |
with open(p, encoding='utf-8') as g:
g.readlines() | ['first line\n', 'second line\n', 'third'] | すべての行をリストで返す。list(g) も同じ結果 |
with open(p, encoding='utf-8') as g:
for line in g:
print(repr(line)) | 'first line\n'
'second line\n'
'third' | ファイルオブジェクトに for をかけると、1行ずつ取り出せる |
空行は '\n' という 1 文字の文字列で、空の文字列 '' はファイルの終端です。読み取った行の末尾には '\n' が付いているので、そのまま print() すると、表示が 1 行おきに空いて見えます。
with文とclose()
公式チュートリアルによると、ファイルオブジェクトを扱うときに with キーワードを使うのは良い習慣で、処理中に例外が発生しても必ず最後にファイルが閉じられます。同じことを try-finally ブロックで書くより、ずっと簡潔です。with を使わない場合は、ファイルを閉じてシステムのリソースを直ちに解放するために f.close() を呼びます。
| コード | 実行結果 | ひとこと |
|---|---|---|
f = open(p, encoding='utf-8')
f.closed | False | close() も with も使っていないので、開いたまま |
f.close()
f.closed | True | close() を呼ぶと閉じる |
with open(p, encoding='utf-8') as g:
data = g.read()
g.closed | True | with ブロックを出ると自動で閉じる |
with ブロックを出た時点で、ファイルは閉じています。公式チュートリアルは、f.write() を with や f.close() を使わずに呼び出すと、プログラムが正常に終了しても、書き込んだ内容がディスクに完全に書き込まれないことがあると警告しています。
jsonでの保存と読み込み
公式チュートリアルによると、json.dumps() はオブジェクトの JSON 形式の文字列表現を返します。json.dump() はオブジェクトをテキストファイルにシリアライズし、json.load() は逆にファイルからデシリアライズします。参考として、pickle は任意の複雑な Python オブジェクトをシリアライズできる反面、Python に特有のプロトコルで、他の言語で書かれたプログラムとは共有できません。
| コード | 実行結果 | ひとこと |
|---|---|---|
import json
json.dumps([1, 'simple', 'list']) | '[1, "simple", "list"]' | dumps() は JSON 形式の文字列を返す |
json.dumps({'a': 1, 'b': None, 'c': True}) | '{"a": 1, "b": null, "c": true}' | None は null、True は true になる |
json.loads('{"a": 1, "b": null, "c": true}') | {'a': 1, 'b': None, 'c': True} | 文字列から Python のオブジェクトに戻す |
with open(p, 'w', encoding='utf-8') as g:
json.dump({'n': 3}, g)
with open(p, encoding='utf-8') as g:
json.load(g) | {'n': 3} | dump() はファイルへ書き、load() はファイルから読む |
末尾に s が付く関数は文字列を扱い、s がない関数はファイルを扱います。dumps() は文字列を返し、dump() はファイルに書きます。Python の None が JSON では null、True が true になる点も、結果の表から確認できます。
Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)
試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。
よくある質問
open() のモード 'w' と 'a' は何が違いますか?
公式チュートリアルによると、'w' は書き込み専用で、同名の既存のファイルがあれば消去されます。'a' はファイルを追記用に開き、書き込まれた内容は自動的にファイルの終端に追加されます。mode を省略した場合は 'r' と見なされます。
readline() が空の文字列を返したときは、何を意味しますか?
公式チュートリアルによると、f.readline() が空の文字列を返したら、ファイルの終端に達したことが分かります。空行は改行1文字だけの文字列 '\n' で表されるので、空行と終端は区別できます。
with文を使うと、何が良いのですか?
公式チュートリアルによると、with を使うと処理中に例外が発生しても必ず最後にファイルが閉じられ、同じことを try-finally で書くより簡潔になります。with も close() も使わずに write() を呼ぶと、内容がディスクに完全に書き込まれないことがあります。
json.dump() と json.dumps() は何が違いますか?
公式チュートリアルによると、dumps() はオブジェクトの JSON 形式の文字列を返し、dump() はオブジェクトをテキストファイルにシリアライズします。読み込みは load() で、ファイルを渡します。
第7章の入出力は、何問出ますか?
このサイトが整理した公式の章別出題数では、40問中1問(2.5%)です。出題数は少ないため、open() のモード、readline()、with、f-string、jsonの要点に絞って確認するのが効率的です。
