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章 入出力は何問収録されていますか?
現在10問を収録しています。内訳は基礎6問・標準4問です。
Q第7章 入出力の頻出論点は何ですか?
ファイルの読み書き、フォーマット済み文字列リテラル(f-string)、str.format()メソッドの引数指定、ファイルオブジェクトのメソッド(f.readline())、jsonモジュールによるデータの保存などが出題対象です(当サイト収録問題に基づく編集部集計)。
Q間違えた問題はどう復習すればいいですか?
誤答した選択肢のどこがずれていたかを解説で確認し、関連用語がある場合は用語集で定義に戻ってから再演習することをおすすめします。
UTF-8のテキストファイルdata.txtを読み、処理中に例外が起きてもファイルを確実に閉じたい。公式チュートリアルの推奨に合う書き方はどれか。
答えと解説を見る
正解は「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章 入出力)
次のコードを実行したときの出力について、公式チュートリアルのフォーマット済み文字列リテラル(f-string)の説明に合うものはどれか。 year = 2016 event = '国民投票' print(f'{year}年の{event}の結果')
答えと解説を見る
正解は「2016年の国民投票の結果 という文字列が出力される」である。公式チュートリアルは、フォーマット済み文字列リテラル(f-string)の内側では'{'と'}'の間にPythonの式を書けると説明しており、例として year = 2016、event = '国民投票' のときf'{year}年の{event}の結果'が'2016年の国民投票の結果'になることを示している。したがって、'{'と'}'の間に式を書けないため構文エラーになるという説明、変数が展開されず'{year}年の{event}の結果'とそのまま出力されるという説明、変数名の文字列がそのまま出力されるという説明は、いずれも公式の記載と一致しない。
https://docs.python.org/ja/3/tutorial/inputoutput.html (Python公式チュートリアル 第7章 入出力)
次のコードの出力について、公式チュートリアルのstr.format()メソッドの説明に合うものはどれか。 print('{1} and {0}'.format('spam', 'eggs'))
答えと解説を見る
正解は「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章 入出力)
テキストモードで開いたファイルオブジェクトfに対してf.readline()を呼び出したときの挙動として、公式チュートリアルの説明に合うものはどれか。
答えと解説を見る
正解は「ファイルから1行を読み取り、読み出された文字列の末尾に改行文字'\n'が残る(ただし改行のない最終行を除く)」である。公式チュートリアルは、f.readline()メソッドがファイルから1行だけを読み取り、改行文字は読み出された文字列の終端に残ると説明している。改行が省略されるのは、ファイルが改行で終わっていない場合の最終行のみである。また、ファイル終端に達した場合は空の文字列を返すと説明されており、常に改行が取り除かれる、終端でNoneを返す、全内容を配列として返すという説明はいずれも公式の記載と一致しない。
https://docs.python.org/ja/3/tutorial/inputoutput.html (Python公式チュートリアル 第7章 入出力)
Pythonのオブジェクトをテキストファイルへ保存し、後で同じ構造のデータとして読み戻したい。公式チュートリアルのjsonモジュールの説明に合う組み合わせはどれか。
答えと解説を見る
正解は「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章 入出力)
open()関数の第2引数(mode)の指定について、公式チュートリアルの説明に合うものはどれか。
答えと解説を見る
正解は「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章 入出力)
次のコードを実行したときの出力について、公式チュートリアルのフォーマット済み文字列リテラル(f-string)の書式指定子の説明に合うものはどれか。 import math print(f'πの値はだいたい {math.pi:.3f} です。')
答えと解説を見る
正解は「πの値はだいたい 3.142 です。(':'の後ろの書式指定子が小数点以下3桁への丸めを指定している)」である。公式チュートリアルは、フォーマット済み文字列リテラルでは式の後ろにオプションのフォーマット指定子を付けられ、このフォーマット指定子によって値のフォーマット方式を制御できると説明し、import mathをしたうえでf'πの値はだいたい {math.pi:.3f} です。'を実行すると'πの値はだいたい 3.142 です。'になる例を示している。したがって、math.piの値がそのまま出力されるという説明、'{'と'}'の中に':'を書けず構文エラーになるという説明、':'の後ろの文字列がそのまま出力されるという説明は、いずれも公式の記載と一致しない。
https://docs.python.org/ja/3/tutorial/inputoutput.html (Python公式チュートリアル 第7章 入出力)
次のコードの出力について、公式チュートリアルのstr.format()メソッドのキーワード引数指定の説明に合うものはどれか。 print('This {food} is {adjective}.'.format(food='spam', adjective='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章 入出力)
テキストファイルのすべての行を読み取りたい場合の方法について、公式チュートリアルの説明に合うものはどれか。
答えと解説を見る
正解は「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章 入出力)
Pythonのオブジェクトをファイルへ保存する方法として、jsonモジュールと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章 入出力)