Python3エンジニア認定基礎試験 ⑥ モジュールとファイル入出力

プログラムを複数ファイルに分割して再利用するモジュールの仕組みと、ファイルの読み書きを学ぶ分野です。importとfrom~import、asによる別名指定、from~import *で読み込まれる名前と__all__属性の関係が頻出です。誤ったインポート記述で起きるImportErrorやModuleNotFoundError、calendarなど標準ライブラリの呼び出し方も問われます。あわせてリスト内包表記の応用も出題されます。インポートの書式ごとに「何が使えるようになるか」を正確に区別できるように整理しておきましょう。出題数36問。

この分野の問題36問を、選択肢・正解・解説つきで掲載しています。まず自分で解答を考えてから「正解と解説を見る」を開いて答え合わせをしてください。

クイズモードで挑戦 →

186ディクショナリの内包表記において、キーを計算式にしたコード d = {x**2: x**3 for x in (1, 3, 6)} を実行して print(d) とした結果として適切なものはどれですか。

  1. A{1: 1, 3: 9, 6: 36}
  2. B{1: 1, 3: 27, 6: 216}
  3. C{1: 1, 9: 3, 36: 6}
  4. D{1: 1, 9: 27, 36: 216}
正解と解説を見る

正解:D{1: 1, 9: 27, 36: 216}

キーにはxを2乗した式(1, 9, 36)が、値には3乗した式(1, 27, 216)が格納されます。

この問題の解説ページを開く →

187次のリスト内包表記を実行した結果として正しいものはどれですか。\nsample = [x for x in range(10) if x % 2 == 0]\nprint(sample)

  1. A[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  2. B[2, 4, 6, 8, 10]
  3. C[0, 2, 4, 6, 8]
  4. D[1, 3, 5, 7, 9]
正解と解説を見る

正解:C[0, 2, 4, 6, 8]

if x % 2 == 0 を満たす偶数だけが残るため[0, 2, 4, 6, 8]になります。

この問題の解説ページを開く →

188標準ライブラリのcalendarモジュールに定義されているprmonth()関数を正しく実行する方法はどれですか。

  1. Aimport prmonth\nprmonth(2000, 1)
  2. Bimport calendar\ncalendar.prmonth(2000, 1)
  3. Cimport calendar\ncalendar(2000, 1)
  4. Dimport calendar.prmonth\ncalendar.prmonth(2000, 1)
正解と解説を見る

正解:Bimport calendar\ncalendar.prmonth(2000, 1)

モジュール内の関数を実行するには、まずモジュールをインポートし、モジュール名.関数名()の形式で呼び出します。

この問題の解説ページを開く →

189calendarモジュールのprmonth()関数を使おうとして import prmonth を実行した場合に発生するエラーとして正しいものはどれですか。

  1. ASyntaxError
  2. BNameError
  3. CModuleNotFoundError
  4. DAttributeError
正解と解説を見る

正解:CModuleNotFoundError

prmonthはモジュール名ではないため、インポートしようとするとModuleNotFoundErrorになります。

この問題の解説ページを開く →

190calendarモジュールのprmonth()関数を使おうとして import calendar.prmonth を実行した場合に発生するエラーとして正しいものはどれですか。

  1. AAttributeError
  2. BTypeError
  3. CSyntaxError
  4. DModuleNotFoundError
正解と解説を見る

正解:DModuleNotFoundError

prmonthはモジュールではないため、このような記述でインポートしようとするとModuleNotFoundErrorになります。

この問題の解説ページを開く →

191import calendar を実行した後に calendar(2000, 1) を実行するとエラーになる理由として最も適切なものはどれですか。

  1. A引数の数が多すぎるため
  2. Bcalendarはモジュールであり関数ではないため
  3. Cprmonth()関数を事前に呼び出していないため
  4. Dcalendarモジュールがインポートされていないため
正解と解説を見る

正解:Bcalendarはモジュールであり関数ではないため

インポートしたcalendarはモジュールオブジェクトであるため、そのまま関数のように呼び出すことはできません。

この問題の解説ページを開く →

192ファイルcalc.pyにあるadd()関数を使うためのインポート方法として正しいものはどれですか。

  1. Afrom add import calc
  2. Bfrom calc import add
  3. Cimport add from calc
  4. Dimport calc from add
正解と解説を見る

正解:Bfrom calc import add

モジュールに含まれる特定の関数のみをインポートする場合、from モジュール名 import 関数名 という書式を使用します。

この問題の解説ページを開く →

193ファイルcalc.pyからadd()関数をインポートする目的で from add import calc と記述した場合に発生するエラーとして正しいものはどれですか。

  1. Aaddという名前のモジュールが存在しないためModuleNotFoundErrorになる
  2. Bcalcという名前の関数が存在しないためAttributeErrorになる
  3. C構文が誤っているためSyntaxErrorになる
  4. Dインポートの順序が逆であるためNameErrorになる
正解と解説を見る

正解:Aaddという名前のモジュールが存在しないためModuleNotFoundErrorになる

addはモジュール名ではなく関数名であるため、fromの後に指定するとModuleNotFoundErrorになります。

この問題の解説ページを開く →

194ファイルcalc.pyにあるadd()関数を import add from calc という記述でインポートしようとした場合、どのような結果になりますか。

  1. AModuleNotFoundErrorが発生する
  2. BSyntaxErrorが発生する
  3. CAttributeErrorが発生する
  4. D正しくadd()関数がインポートされる
正解と解説を見る

正解:BSyntaxErrorが発生する

Pythonの構文としてimport... from...という形式は認められていないため、SyntaxErrorになります。

この問題の解説ページを開く →

195from calc import * を実行したとき、calcモジュールに __all__ 属性が存在しない場合に使用可能となる名前の説明として正しいものはどれですか。

  1. Acalcモジュール内のすべての名前
  2. Bcalcモジュール名とモジュール内のすべての名前
  3. Ccalcモジュール名とモジュール内のアンダースコア「_」で始まらない名前
  4. Dcalcモジュール内のアンダースコア「_」で始まらない名前
正解と解説を見る

正解:Dcalcモジュール内のアンダースコア「_」で始まらない名前

__all__属性が存在しない場合、アスタリスクを用いたインポートではアンダースコアで始まる名前以外のすべての名前が使えます。

この問題の解説ページを開く →

196from calc import * を実行した際(__all__属性は存在しないものとする)、インポートされない名前の特徴として正しいものはどれですか。

  1. Aすべての大文字で始まる名前
  2. B数字が含まれる名前
  3. Cモジュール内で定義された変数名
  4. Dアンダースコア「_」で始まる名前
正解と解説を見る

正解:Dアンダースコア「_」で始まる名前

アスタリスクを使用したインポートでは、アンダースコア「_」で始まる名前はインポート対象から除外されます。

この問題の解説ページを開く →

197from calc import * を実行した場合、呼び出し側のコードにおいて calc.add() のようにモジュール名自体を使用することはできますか。

  1. Aモジュール名も含めてすべてインポートされるため使用できる
  2. B__all__属性が定義されている場合のみ使用できる
  3. Cモジュール名自体はインポートされないため使用できない
  4. D関数名とモジュール名が同じ場合のみ使用できる
正解と解説を見る

正解:Cモジュール名自体はインポートされないため使用できない

from モジュール名 import * の形式では、モジュール内の名前はインポートされますが、モジュール名自体はインポートされません。

この問題の解説ページを開く →

198モジュール内に __all__ という文字列のリストが存在する場合、from モジュール名 import * を実行したときにインポートされる名前はどうなりますか。

  1. A__all__というリスト内の名前だけがインポートされる
  2. Bモジュール内のすべての名前がインポートされる
  3. Cアンダースコアで始まる名前も含めてすべてインポートされる
  4. D__all__というリストに含まれない名前だけがインポートされる
正解と解説を見る

正解:A__all__というリスト内の名前だけがインポートされる

モジュールに__all__属性が存在する場合、そのリスト内に指定されている名前だけがインポートの対象となります。

この問題の解説ページを開く →

199calendarモジュールを別名「cal」としてインポートするための正しい書式はどれですか。

  1. Aimport calendar to cal
  2. Bimport calendar as cal
  3. Cfrom calendar import cal
  4. Dimport cal from calendar
正解と解説を見る

正解:Bimport calendar as cal

モジュールを別名でインポートする場合、import モジュール名 as 別名 という書式を使用します。

この問題の解説ページを開く →

200import calendar as cal とインポートしたコードにおいて、print(calendar.calendar(2000)) を実行した場合の結果として正しいものはどれですか。

  1. A2000年のカレンダーが正しく出力される
  2. Bcalendarモジュールが見つからないためModuleNotFoundErrorになる
  3. C引数の形式が不正なためTypeErrorになる
  4. D別名を定義したためNameError(またはエラー)になる
正解と解説を見る

正解:D別名を定義したためNameError(またはエラー)になる

別名calを指定してインポートした場合、元のモジュール名であるcalendarという名前は使用できなくなります。

この問題の解説ページを開く →

201calendarモジュールのcalendar()関数を別名「cal」としてインポートするための正しい書式はどれですか。

  1. Aimport calendar.calendar as cal
  2. Bfrom calendar.calendar import cal
  3. Cimport cal from calendar.calendar
  4. Dfrom calendar import calendar as cal
正解と解説を見る

正解:Dfrom calendar import calendar as cal

関数を別名でインポートする場合、from モジュール名 import 関数名 as 関数の別名 という書式を使用します。

この問題の解説ページを開く →

202from calendar import calendar as cal とインポートしたコードにおいて、print(calendar.cal(2000)) を実行した場合の結果として正しいものはどれですか。

  1. Acalendarという名前のモジュールはインポートされていないためエラーになる
  2. B2000年のカレンダーが正しく出力される
  3. Ccal()関数が呼び出されテキストモードで出力される
  4. Dcalendar.calという属性が存在しないためAttributeErrorになる
正解と解説を見る

正解:Acalendarという名前のモジュールはインポートされていないためエラーになる

この形式でインポートした場合、関数は別名calとしてインポートされますが、calendarというモジュール自体はインポートされません。

この問題の解説ページを開く →

203from calendar import calendar as calendar というコードを実行して print(calendar(2000)) を呼び出した場合、どのような動作になりますか。

  1. A関数の別名にモジュールと同じ名前を指定することはできないためSyntaxErrorになる
  2. B関数の別名として「calendar」が使われcalendar()関数が正しく実行される
  3. Ccalendarという名前のモジュール自体がインポートされる
  4. Dモジュール名と関数名が衝突し処理が停止して例外が発生する
正解と解説を見る

正解:B関数の別名として「calendar」が使われcalendar()関数が正しく実行される

関数の別名としてモジュールと同じ名前(calendar)を指定することは可能であり、その名前で関数が実行できます。

この問題の解説ページを開く →

204モジュールの属性 __name__ に関する説明として正しいものはどれですか。

  1. Aモジュールの開発者名が自動で代入される
  2. Bモジュールが含まれるパッケージのディレクトリ名が代入される
  3. Cモジュール名が自動で代入される
  4. Dモジュール内で定義されている関数名のリストが代入される
正解と解説を見る

正解:Cモジュール名が自動で代入される

__name__はモジュールの属性であり、そこにはモジュール名が自動で代入されます。

この問題の解説ページを開く →

205モジュールが「メインモジュール」として直接スクリプト実行されている場合、属性 __name__ に代入される文字列はどれですか。

  1. A__module__
  2. Bmain
  3. C__main__
  4. D__init__
正解と解説を見る

正解:C__main__

メインモジュール(スクリプトとして直接実行されたpyファイル)として実行されている場合、__name__には__main__が代入されます。

この問題の解説ページを開く →

206Pythonにおいて、複数のモジュールファイルをまとめて扱う通常の「パッケージ」を作成する際、そのディレクトリ内に配置する特別なファイル名はどれですか。

  1. A__main__.py
  2. B__all__.py
  3. Ccore.py
  4. D__init__.py
正解と解説を見る

正解:D__init__.py

ディレクトリに__init__.pyというファイルを配置することで、そのディレクトリをパッケージとしてインポートできるようになります。

この問題の解説ページを開く →

207import package_name を実行してパッケージをインポートしたとき、自動的に内容が読み込まれるファイルはどれですか。

  1. Apackage_name/core.py
  2. Bpackage_name/__main__.py
  3. Cpackage_name/__init__.py
  4. Dpackage_name/dump.py
正解と解説を見る

正解:Cpackage_name/__init__.py

パッケージをインポートすると、そのパッケージのディレクトリ内にある__init__.pyファイルの内容が読み込まれます。

この問題の解説ページを開く →

208パッケージ「bookcard」のサブモジュール「dump」に関数「dump_card」が定義されているとき、ファイル bookcard/__init__.py が空ファイルであっても from bookcard.dump import dump_card を実行することは可能ですか。

  1. A空ファイルであっても実行可能である
  2. B__init__.pyにdumpモジュールを登録しなければ実行できない
  3. C__init__.pyが空の場合はModuleNotFoundErrorになる
  4. Ddump_cardが__init__.pyに定義されている場合のみ実行できる
正解と解説を見る

正解:A空ファイルであっても実行可能である

__init__.pyが空のファイルであっても、パッケージ内のサブモジュールから特定の関数を問題なくインポートできます。

この問題の解説ページを開く →

209パッケージ内の __init__.py ファイルにおいて、同じパッケージ内のサブモジュールを通常のモジュールのように import dump や from dump import * と記述した場合はどうなりますか。

  1. A通常のモジュールとは異なるためインポート時にエラーになる
  2. B相対インポートと同様に正しくインポートできる
  3. Cdumpがビルトインモジュールの場合のみインポートできる
  4. D__init__.pyが空ファイルであるとみなされる
正解と解説を見る

正解:A通常のモジュールとは異なるためインポート時にエラーになる

__init__.py内では、通常のモジュールのようにサブモジュールをそのまま import dump などの形で記述することはできず、エラーになります。

この問題の解説ページを開く →

210ドット「.」を使った相対インポートにおいて、同じ階層から別のサブモジュール「core」をインポートする場合の正しい記述はどれですか。

  1. Aimport .core
  2. Bfrom . import core
  3. Cfrom .. import core
  4. Dimport core from .
正解と解説を見る

正解:Bfrom . import core

同じ階層から別サブモジュールをインポートする書式は、from . import サブモジュール名 となります。

この問題の解説ページを開く →

211相対インポートにおいて、「1つ上の階層」を参照するために使用するドット「.」の数として正しいものはどれですか。

  1. A1つ
  2. B3つ
  3. C2つ
  4. D4つ
正解と解説を見る

正解:C2つ

相対インポートの書式において、ドット2つ(..)で1つ上にある階層を参照することを示します。

この問題の解説ページを開く →

212相対インポートにおいて、「1つ上の階層の別サブモジュール dump」から「名前」をインポートする場合の正しい書式はどれですか。

  1. Afrom .dump import 名前
  2. Bfrom .. import dump.名前
  3. Cfrom ..dump import 名前
  4. Dimport 名前 from ..dump
正解と解説を見る

正解:Cfrom ..dump import 名前

1つ上の階層の別サブモジュールから名前をインポートする書式は、from ..サブモジュール名 import 名前 となります。

この問題の解説ページを開く →

213Pythonでインポートを実行した際、モジュールを調べる正しい順番はどれですか。

  1. Asys.pathに入っているパス → ビルトインモジュール
  2. Bビルトインモジュール → sys.pathに入っているパス
  3. C標準ライブラリの場所 → 実行ファイルのディレクトリ
  4. Dカレントディレクトリ → 標準ライブラリ → ビルトインモジュール
正解と解説を見る

正解:Bビルトインモジュール → sys.pathに入っているパス

インポート時にモジュールを調べる順番は、最初にビルトインモジュール、次にsys.pathに入っているパスの順になります。

この問題の解説ページを開く →

214モジュール検索パスを保持する sys.path のリストに、通常(デフォルトで)含まれている内容として正しいものはどれですか。

  1. A実行ファイルのディレクトリや標準ライブラリの場所など
  2. Bビルトインモジュールの名前リスト
  3. Cpipでインストールしたパッケージのバージョン一覧
  4. Dすべてのパッケージの__init__.pyのパス
正解と解説を見る

正解:A実行ファイルのディレクトリや標準ライブラリの場所など

sys.pathは変更可能ですが、通常は実行ファイルのディレクトリや標準ライブラリの場所などが入っています。

この問題の解説ページを開く →

215open()関数を使ってファイルを開く際、mode引数を省略した場合はどのモードで開かれたとみなされますか。

  1. Aw""(テキストモードの新規書き込み用)
  2. Brb""(バイナリモードの読み込み専用)
  3. Ca""(テキストモードの追加書き込み用)
  4. Dr""(テキストモードの読み込み専用)
正解と解説を見る

正解:Dr""(テキストモードの読み込み専用)

open()関数のmode引数を省略した場合、テキストモードの読み込み専用である""r""を指定したものとみなされます。

この問題の解説ページを開く →

216open()関数のmode引数において、「バイナリモードで新規に書き込む」ために指定する文字列として正しいものはどれですか。

  1. Awb""
  2. Bb""
  3. Cw""
  4. Dab""
正解と解説を見る

正解:Awb""

バイナリモードを表す""b""と、新規書き込みを表す""w""を組み合わせた""wb""を使用します。

この問題の解説ページを開く →

217open()関数のmode引数において、「バイナリモードで追加書き込みをする」ために指定する文字列として正しいものはどれですか。

  1. Aa""
  2. Bb+""
  3. Crb""
  4. Dab""
正解と解説を見る

正解:Dab""

バイナリモードを表す""b""と、追加書き込みを表す""a""を組み合わせた""ab""を使用します。

この問題の解説ページを開く →

218open()関数で「バイナリモードで読み込む」ための指定方法について、正しい説明はどれですか。

  1. Ab"" という文字だけを指定すればよい
  2. Br"" を指定すれば自動的にバイナリモードになる
  3. Crb"" を指定する必要があり""b"" だけの指定はできない
  4. Dbr"" または ""b"" のどちらを指定してもよい
正解と解説を見る

正解:Crb"" を指定する必要があり""b"" だけの指定はできない

バイナリモードで読み込むには""rb""を使います。このとき、""b""だけの指定はできません。

この問題の解説ページを開く →

219ファイルオブジェクトを「fp」としたとき、ファイルの内容をすべて読み込んで文字列(またはデータ)として取得するために使用するメソッドはどれですか。

  1. Afp.read()
  2. Bfp.load()
  3. Cread(fp)
  4. Dload(fp)
正解と解説を見る

正解:Afp.read()

ファイルオブジェクトからファイル全体の内容を読み出すには、read()メソッドを使用し、fp.read()と記述します。

この問題の解説ページを開く →

220ファイルをオープンする際に「with」文を使用することの最大の特徴(メリット)として、最も適切なものはどれですか。

  1. Aファイルの閉じ処理(クローズ)が自動で行われ例外発生時にも実行される
  2. Bファイルの読み込み速度が大幅に向上する
  3. Cテキストモードとバイナリモードを自動で判別して開いてくれる
  4. Dファイルが存在しない場合に自動的に空のファイルを新規作成する
正解と解説を見る

正解:Aファイルの閉じ処理(クローズ)が自動で行われ例外発生時にも実行される

with文を使うことで、ファイルの処理後に閉じる処理(close()メソッドの呼び出し)が自動で行われ、これは例外発生時にも適用されます。

この問題の解説ページを開く →

221ファイルオブジェクト「fp」をfor文で繰り返すコード for s in fp: を実行したとき、変数「s」にはどのような単位でデータが代入されますか。

  1. Aファイル全体の文字列
  2. Bファイルから読み込まれた1行ずつ
  3. Cファイルから読み込まれた1文字ずつ
  4. Dファイルから読み込まれた1バイトずつ
正解と解説を見る

正解:Bファイルから読み込まれた1行ずつ

ファイルオブジェクトは反復可能体の1つであり、for文で繰り返すことにより、行ごとに1行ずつ内容を取り出すことができます。

この問題の解説ページを開く →
Python3エンジニア認定基礎試験の全分野一覧へ戻る