AI資格ドリル
資格を選ぶ

Python3エンジニア認定基礎試験 第7章 入出力 予想問題と解説

Python3エンジニア認定基礎試験「第7章 入出力」の予想問題を10問収録しています。各問を解説つきで掲載し、全問は演習画面で解けます。出題は公式シラバスの範囲内です。

この章の要点

ファイルの読み書き、フォーマット済み文字列リテラル(f-string)、str.format()メソッドの引数指定、ファイルオブジェクトのメソッド(f.readline())、jsonモジュールによるデータの保存などを扱う分野です。全10問(基礎6問・標準4問)を収録しています。

  • ファイルの読み書き
  • フォーマット済み文字列リテラル(f-string)
  • str.format()メソッドの引数指定
  • ファイルオブジェクトのメソッド(f.readline())
  • jsonモジュールによるデータの保存

情報源と編集区分

公式範囲を確認し、問題数・難易度・確認点は当サイトが集計・編集。

試験概要(公式)

確認しておきたいポイント

当サイトの作問時に観察した、取り違えやすい論点です(公式の統計ではありません)。

  • ファイルを開くモードと閉じる時点の取り違え。読み取りにはr、上書きにはwを使い、with文なら処理中に例外が起きてもブロック終了時にファイルが閉じられる。

よくある質問

Q第7章 入出力は何問収録されていますか?

A

現在10問を収録しています。内訳は基礎6問・標準4問です。

Q第7章 入出力の頻出論点は何ですか?

A

ファイルの読み書き、フォーマット済み文字列リテラル(f-string)、str.format()メソッドの引数指定、ファイルオブジェクトのメソッド(f.readline())、jsonモジュールによるデータの保存などが出題対象です(当サイト収録問題に基づく編集部集計)。

Q間違えた問題はどう復習すればいいですか?

A

誤答した選択肢のどこがずれていたかを解説で確認し、関連用語がある場合は用語集で定義に戻ってから再演習することをおすすめします。

第1問 ・ ファイルの読み書き

UTF-8のテキストファイルdata.txtを読み、処理中に例外が起きてもファイルを確実に閉じたい。公式チュートリアルの推奨に合う書き方はどれか。

  • アf = open("data.txt", "r") とだけ書き、処理終了時のclose()は呼び出さない
  • イf = open("data.txt", "r", encoding="utf-8") の直後にf.close()を呼んでから読み取る
  • ウwith open("data.txt", "w", encoding="utf-8") as f: のブロック内で読み取る
  • エwith open("data.txt", "r", encoding="utf-8") as f: のブロック内で読み取る
答えと解説を見る
エwith open("data.txt", "r", encoding="utf-8") as f: のブロック内で読み取る正解
解説

正解は「with open("data.txt", "r", encoding="utf-8") as f: のブロック内で読み取る」である。公式チュートリアルは、ファイルオブジェクトを扱うときにwithキーワードを使うことを推奨している。withブロックを抜ける際には、途中で例外が発生した場合でもファイルが正しく閉じられるため、同等のtry-finallyを書くより短く安全に後始末を表現できる。open()したままclose()を省略する書き方は、書き込みが完全にディスクへ反映されないなどの問題につながり得る。読み取り前にclose()を呼べば、その後そのファイルオブジェクトから読み取れない。また、wモードはファイルを書き込み用に開き、既存の同名ファイルを切り詰める。今回はUTF-8のテキストを読むため、読み出し用のrモードとencodingの組み合わせが適切である。

https://docs.python.org/ja/3/tutorial/inputoutput.html (Python公式チュートリアル 第7章 入出力)

問題番号: py3b-044
問題番号 py3b-044 の誤りを報告する
第2問 ・ フォーマット済み文字列リテラル(f-string)

次のコードを実行したときの出力について、公式チュートリアルのフォーマット済み文字列リテラル(f-string)の説明に合うものはどれか。 year = 2016 event = '国民投票' print(f'{year}年の{event}の結果')

  • ア2016年の国民投票の結果 という文字列が出力される
  • イf-stringの'{'と'}'の間にはPythonの式を書けないため、構文エラーになる
  • ウ{year}年の{event}の結果 という文字列がそのまま出力される(変数は展開されない)
  • エyearとeventという変数名の文字列がそのまま出力される
答えと解説を見る
ア2016年の国民投票の結果 という文字列が出力される正解
解説

正解は「2016年の国民投票の結果 という文字列が出力される」である。公式チュートリアルは、フォーマット済み文字列リテラル(f-string)の内側では'{'と'}'の間にPythonの式を書けると説明しており、例として year = 2016、event = '国民投票' のときf'{year}年の{event}の結果'が'2016年の国民投票の結果'になることを示している。したがって、'{'と'}'の間に式を書けないため構文エラーになるという説明、変数が展開されず'{year}年の{event}の結果'とそのまま出力されるという説明、変数名の文字列がそのまま出力されるという説明は、いずれも公式の記載と一致しない。

https://docs.python.org/ja/3/tutorial/inputoutput.html (Python公式チュートリアル 第7章 入出力)

問題番号: py3b-063
問題番号 py3b-063 の誤りを報告する
第3問 ・ str.format()メソッドの引数指定

次のコードの出力について、公式チュートリアルのstr.format()メソッドの説明に合うものはどれか。 print('{1} and {0}'.format('spam', 'eggs'))

  • アspam and eggs(引数を渡した順番のまま出力される)
  • イeggs and spam(波括弧内の数字が参照する引数の位置を指定する)
  • ウ構文エラーになる(波括弧に数字を入れることはできない)
  • エ1 and 0 (波括弧の中身がそのまま出力される)
答えと解説を見る
イeggs and spam(波括弧内の数字が参照する引数の位置を指定する)正解
解説

正解は「eggs and spam(波括弧内の数字が参照する引数の位置を指定する)」である。公式チュートリアルは、str.format()メソッドで波括弧の中に数字を書くと、その数字がformat()に渡した引数の位置を指定すると説明し、例として'{1} and {0}'.format('spam', 'eggs')が'eggs and spam'になることを示している。したがって、「渡した順のまま'spam and eggs'になる」「数字を入れると構文エラーになる」「'1 and 0'とそのまま出力される」の三つの選択肢は、公式チュートリアルの説明と合いません。

https://docs.python.org/ja/3/tutorial/inputoutput.html (Python公式チュートリアル 第7章 入出力)

問題番号: py3b-064
問題番号 py3b-064 の誤りを報告する
第4問 ・ ファイルオブジェクトのメソッド(f.readline())

テキストモードで開いたファイルオブジェクトfに対してf.readline()を呼び出したときの挙動として、公式チュートリアルの説明に合うものはどれか。

  • ア改行文字は常に取り除かれた状態で返される
  • イファイル終端に達するとNoneを返す
  • ウファイルから1行を読み取り、読み出された文字列の末尾に改行文字'\n'が残る(ただし改行のない最終行を除く)
  • エ呼び出すたびにファイルの全内容を1行ずつ配列として返す
答えと解説を見る
ウファイルから1行を読み取り、読み出された文字列の末尾に改行文字'\n'が残る(ただし改行のない最終行を除く)正解
解説

正解は「ファイルから1行を読み取り、読み出された文字列の末尾に改行文字'\n'が残る(ただし改行のない最終行を除く)」である。公式チュートリアルは、f.readline()メソッドがファイルから1行だけを読み取り、改行文字は読み出された文字列の終端に残ると説明している。改行が省略されるのは、ファイルが改行で終わっていない場合の最終行のみである。また、ファイル終端に達した場合は空の文字列を返すと説明されており、常に改行が取り除かれる、終端でNoneを返す、全内容を配列として返すという説明はいずれも公式の記載と一致しない。

https://docs.python.org/ja/3/tutorial/inputoutput.html (Python公式チュートリアル 第7章 入出力)

問題番号: py3b-065
問題番号 py3b-065 の誤りを報告する
第5問 ・ jsonモジュールによるデータの保存

Pythonのオブジェクトをテキストファイルへ保存し、後で同じ構造のデータとして読み戻したい。公式チュートリアルのjsonモジュールの説明に合う組み合わせはどれか。

  • アjson.dumps(x)でJSON文字列を作り、json.load(f)でファイルから直接デシリアライズする(書き込みは行わない)
  • イjson.dump(x, f)は文字列を返すだけで、ファイルへは書き込まない
  • ウjson.load(f)はPythonオブジェクトをファイルへ書き込むための関数である
  • エjson.dump(x, f)でファイルへシリアライズし、json.load(f)でファイルからデシリアライズする
答えと解説を見る
エjson.dump(x, f)でファイルへシリアライズし、json.load(f)でファイルからデシリアライズする正解
解説

正解は「json.dump(x, f)でファイルへシリアライズし、json.load(f)でファイルからデシリアライズする」である。公式チュートリアルは、jsonモジュールのjson.dump()関数がオブジェクトをテキストファイルにシリアライズし、json.load()関数がテキストファイルまたはバイナリファイルからデシリアライズすると説明している。json.dumps()はオブジェクトのJSON形式の文字列表現を返すだけでファイルへは書き込まないため、json.dumps(x)とjson.load(f)を組み合わせても、その文字列を別途ファイルへ書き込まない限り保存にはならない。したがって、json.dumpが文字列を返すだけでファイルへ書き込まないという説明や、json.loadがファイルへ書き込むための関数だという説明は、いずれも公式の記載と一致しない。

https://docs.python.org/ja/3/tutorial/inputoutput.html (Python公式チュートリアル 第7章 入出力)

問題番号: py3b-066
問題番号 py3b-066 の誤りを報告する
第6問 ・ ファイルの読み書き

open()関数の第2引数(mode)の指定について、公式チュートリアルの説明に合うものはどれか。

  • アmode引数を省略すると'r'(読み出し専用)であると仮定される。'w'は書き込み専用(同名の既存ファイルがあれば消去)、'a'は追記用、'r+'は読み書き両用である
  • イmode引数を省略すると'w'(書き込み専用)であると仮定され、既存の同名ファイルは自動的に末尾へ追記される
  • ウ'a'は読み出し専用のモードであり、書き込みには使えない。'r+'はファイルを追記用に開くモードである
  • エ'r+'は読み出し専用のモードで、書き込みを行うには必ず別途'w'で開き直す必要がある
答えと解説を見る
アmode引数を省略すると'r'(読み出し専用)であると仮定される。'w'は書き込み専用(同名の既存ファイルがあれば消去)、'a'は追記用、'r+'は読み書き両用である正解
解説

正解は「mode引数を省略すると'r'(読み出し専用)であると仮定される。'w'は書き込み専用(同名の既存ファイルがあれば消去)、'a'は追記用、'r+'は読み書き両用である」である。公式チュートリアルはopen(filename, mode, encoding=None)について、modeが読み出し専用なら'r'、書き込み専用(同名の既存ファイルがあれば消去される)なら'w'とすると説明し、'a'はファイルを追記用に開き書き込まれた内容は自動的にファイルの終端に追加される、'r+'はファイルを読み書き両用に開くと説明している。またmode引数は省略可能で、省略された場合には'r'であると仮定されるとも述べている。したがって、省略時に'w'が仮定されて自動的に追記されるという説明、'a'が読み出し専用で書き込みに使えないという説明、'r+'が読み出し専用で書き込みには'w'で開き直す必要があるという説明は、いずれも公式の記載と一致しない。

https://docs.python.org/ja/3/tutorial/inputoutput.html (Python公式チュートリアル 第7章 入出力)

問題番号: py3b-089
問題番号 py3b-089 の誤りを報告する
第7問 ・ フォーマット済み文字列リテラル(f-string)

次のコードを実行したときの出力について、公式チュートリアルのフォーマット済み文字列リテラル(f-string)の書式指定子の説明に合うものはどれか。 import math print(f'πの値はだいたい {math.pi:.3f} です。')

  • アπの値はだいたい 3.14159265358979 です。(math.piの値がそのまま出力される)
  • イπの値はだいたい 3.142 です。(':'の後ろの書式指定子が小数点以下3桁への丸めを指定している)
  • ウ構文エラーになる(f-stringの'{'と'}'の中に':'を書くことはできない)
  • エπの値はだいたい .3f です。(':'の後ろの文字列がそのまま出力される)
答えと解説を見る
イπの値はだいたい 3.142 です。(':'の後ろの書式指定子が小数点以下3桁への丸めを指定している)正解
解説

正解は「πの値はだいたい 3.142 です。(':'の後ろの書式指定子が小数点以下3桁への丸めを指定している)」である。公式チュートリアルは、フォーマット済み文字列リテラルでは式の後ろにオプションのフォーマット指定子を付けられ、このフォーマット指定子によって値のフォーマット方式を制御できると説明し、import mathをしたうえでf'πの値はだいたい {math.pi:.3f} です。'を実行すると'πの値はだいたい 3.142 です。'になる例を示している。したがって、math.piの値がそのまま出力されるという説明、'{'と'}'の中に':'を書けず構文エラーになるという説明、':'の後ろの文字列がそのまま出力されるという説明は、いずれも公式の記載と一致しない。

https://docs.python.org/ja/3/tutorial/inputoutput.html (Python公式チュートリアル 第7章 入出力)

問題番号: py3b-090
問題番号 py3b-090 の誤りを報告する
第8問 ・ str.format()メソッドの引数指定

次のコードの出力について、公式チュートリアルのstr.format()メソッドのキーワード引数指定の説明に合うものはどれか。 print('This {food} is {adjective}.'.format(food='spam', adjective='absolutely horrible'))

  • アThis food is adjective.(波括弧の中の名前がそのまま出力される)
  • イ構文エラーになる(波括弧の中には数字しか書けない)
  • ウThis spam is absolutely horrible.(波括弧の中の名前がキーワード引数の名前として参照される)
  • エThis absolutely horrible is spam.(キーワード引数は渡した順と逆順に当てはめられる)
答えと解説を見る
ウThis spam is absolutely horrible.(波括弧の中の名前がキーワード引数の名前として参照される)正解
解説

正解は「This spam is absolutely horrible.(波括弧の中の名前がキーワード引数の名前として参照される)」である。公式チュートリアルは、str.format()メソッドにキーワード引数が渡された場合、その値はキーワード引数の名前によって参照されると説明し、'This {food} is {adjective}.'.format(food='spam', adjective='absolutely horrible')が'This spam is absolutely horrible.'になる例を示している。波括弧の中に書いた'food'・'adjective'という名前が、それぞれ対応するキーワード引数の値に置き換えられる。したがって、「波括弧の中の名前がそのまま出力される」「波括弧の中には数字しか書けず構文エラーになる」「キーワード引数が渡した順と逆順に当てはめられる」の三つの選択肢は、いずれも公式チュートリアルの説明と合いません。

https://docs.python.org/ja/3/tutorial/inputoutput.html (Python公式チュートリアル 第7章 入出力)

問題番号: py3b-091
問題番号 py3b-091 の誤りを報告する
第9問 ・ ファイルオブジェクトのメソッド(f.readline())

テキストファイルのすべての行を読み取りたい場合の方法について、公式チュートリアルの説明に合うものはどれか。

  • アf.readline()を1度だけ呼び出せば、ファイルのすべての行が一度にリストとして返る
  • イlist(f)やf.readlines()を使うか、ファイルオブジェクトに対してforループを書くことで、すべての行を読み取れる
  • ウすべての行を読み取る方法は用意されておらず、f.readline()をファイル終端に達するまで手動で呼び続けるしかない
  • エfor line in f: のように書くと、ファイルの内容ではなくファイル名の文字だけが1文字ずつ読み取られる
答えと解説を見る
イlist(f)やf.readlines()を使うか、ファイルオブジェクトに対してforループを書くことで、すべての行を読み取れる正解
解説

正解は「list(f)やf.readlines()を使うか、ファイルオブジェクトに対してforループを書くことで、すべての行を読み取れる」である。公式チュートリアルは、ファイルのすべての行をリスト形式で読み取りたいならlist(f)やf.readlines()を使うこともできると説明し、複数行を読み取るにはファイルオブジェクトに対してループを書く方法があり、この方法はメモリを効率的に使え、高速で、簡潔なコードになるとも説明している。f.readline()は1行だけを読み取るメソッドであり、1度の呼び出しでファイルのすべての行が一度に返るわけではない。すべての行を読み取る方法が用意されていないという説明や、for line in f: がファイル名の文字を1文字ずつ読み取るという説明は、いずれも公式の記載と一致しない。

https://docs.python.org/ja/3/tutorial/inputoutput.html (Python公式チュートリアル 第7章 入出力)

問題番号: py3b-092
問題番号 py3b-092 の誤りを報告する
第10問 ・ jsonモジュールによるデータの保存

Pythonのオブジェクトをファイルへ保存する方法として、jsonモジュールとpickleモジュールを比べたとき、公式チュートリアルの説明に合うものはどれか。

  • アpickleはJSONと同じテキスト形式で、Python以外の言語で書かれたアプリケーションとも問題なく通信できる
  • イjsonはPythonに特有のプロトコルであり、他の言語で書かれたアプリケーションとは通信できない
  • ウpickleは常に安全で、信頼できない送信元から受け取ったデータをデシリアライズしても問題は起きない
  • エpickleはJSONと対照的にPythonに特有のプロトコルで、信頼できない送信元のpickleデータをデシリアライズすると任意のコードが実行される危険がある
答えと解説を見る
エpickleはJSONと対照的にPythonに特有のプロトコルで、信頼できない送信元のpickleデータをデシリアライズすると任意のコードが実行される危険がある正解
解説

正解は「pickleはJSONと対照的にPythonに特有のプロトコルで、信頼できない送信元のpickleデータをデシリアライズすると任意のコードが実行される危険がある」である。公式チュートリアルは参考として、JSONとは対照的にpickleは任意の複雑なPythonオブジェクトをシリアライズ可能なプロトコルだが、Pythonに特有のプロトコルであり他の言語で記述されたアプリケーションと通信するのには使えないと説明している。さらに、pickleはデフォルトでは安全でなく、信頼できない送信元から送られてきた、スキルのある攻撃者によって生成されたpickleデータをデシリアライズすると、攻撃者により任意のコードが実行されてしまうとも説明している。したがって、pickleが他の言語のアプリケーションと問題なく通信できるという説明、jsonがPythonに特有で他の言語と通信できないという説明、pickleが常に安全だという説明は、いずれも公式の記載と一致しない。

https://docs.python.org/ja/3/tutorial/inputoutput.html (Python公式チュートリアル 第7章 入出力)

問題番号: py3b-093
問題番号 py3b-093 の誤りを報告する

執筆: AI資格ドリル編集部(運営者情報を見る)