第8章_ファイルの入出力
今回の項目では、ファイルの入出力ついて出題されます。
本試験の主教材である「Python3エンジニア認定基礎試験問題集」では第8章(P110~P111)の4問の内容です。
練習問題 1
次以下の文章を正しい文章に修正してください。
rを指定すると、読み書き両用である。
答えはコチラをクリック!
答え1:r+を指定すると、読み書き両用である。
答え2:rを指定すると、読み取り専用である。
ポイント
〇〇は読み取り専用である。
rは読み取り専用である。
rは読み込み専用で、r+は読み書き両用である。
練習問題 2
次のコードを実行してファイルの内容を読み取りたいとき誤っている部分はどこでしょう。
fp = open("data1.txt")
s = fp.load()
答えはコチラをクリック!
答え:s = fp.read()
ポイント
〇〇でファイルの内容を読み取ることが出来る。
read()でファイルの内容を読み取ることが出来る。
load()メソッドは存在しないため、エラーが出る。
読み込みたい場合はread()を使用する。
練習問題 3
次のコードを実行した時、何行目の直後でfile2が閉じられているでしょう。
fp1 = open("file1")
data1 = fp1.read()
with open("file2") as fp2
data2 = fp2.read()
print(data1)
print(data2)
答えはコチラをクリック!
答え:4行目
ポイント
○○は自動的にファイルを閉じる。
withは自動的にファイルを閉じる。
- fp1 = open(“file1”) で file1を開きます。
- data1 = fp1.read() で file1の内容を読み込みます。
- with open(“file2”) as fp2: で file2を開き、fp2というファイルオブジェクトが作成されます。
- 内部の data2 = fp2.read() で file2の内容を読み込みます。
- withブロックが終了すると自動的に file2は閉じられます。この時点が重要です。
練習問題 4
次のコードを実行した際の出力結果を示してください。
fp = open("data.txt")
for s in fp:
print(s)
1
2
3
答えはコチラをクリック!
答え: 1
2
3
ポイント
fpをファイルオブジェクトとしたときfor文で〇〇読み込める。
fpをファイルオブジェクトとしたときfor文で1行ずつ読み込める。
確認問題 1
open()関数のmode引数について正しいものを選択してください。
1、wbを指定すると、バイナリモードで追加書き込み出来る。
2、bを指定すると、バイナリモードを読み込むことが出来る。
3、rを指定すると、テキストモードを読み込むことが出来る。
4、abを指定すると、バイナリモードで新規書き込みできる。
答えはコチラをクリック!
答え:3
- 「wbを指定すると、バイナリモードで追加買い込み出来る。」
- 誤りです。wbは「write binary」を意味し、バイナリモードで新たにファイルを作成して書き込むことを指定します。ファイルが既に存在する場合は、内容が上書きされます。追加書き込みをする場合はab(append binary)を使います。
- 「bを指定すると、バイナリモードを読み込むことが出来る。」
- 誤りです。bはバイナリモードを指定するためには、他のモード(例えば、rbやwb)と組み合わせる必要があります。単独でbを指定することはできません。
- 「rを指定すると、テキストモードを読み込むことが出来る。」
- 正しいです。rは「read」を意味し、テキストモードでファイルを読み込むことを指定します。このモードで開いたファイルは既存の内容を読み取ることができます。
- 「abをしていすると、バイナリモードで新規書き込みできる。」
- 誤りです。abは「append binary」を意味し、バイナリモードでファイルの末尾に追加書き込みを行うことを指定します。新規書き込み(新しいファイルを作成して書き込む場合)にはwbを使用します。
確認問題 2
次のコードを実行してファイルの内容を読み込みたい場合、空欄➀に入る記述として正しいものを選択してください。
fp = open("data1.txt")
➀
1、s = load(fp)
2、s = read(fp)
3、s = fp.load()
4、s = fp.read()
答えはコチラをクリック!
答え:4
各選択肢の解説
- s = load(fp)
- 誤りです。Pythonの標準ライブラリにはload()というメソッドは存在しません。また、ファイルオブジェクトに対してload()を適用することもできません。
- s = read(fp)
- 誤りです。read()というメソッドはファイルオブジェクトに対して使用されるものであり、引数としてファイルオブジェクトを取るものではありません。このままでは正しく動作しません。
- s = fp.load()
- 誤りです。fpはファイルオブジェクトですが、Pythonのファイルオブジェクトにはload()メソッドは存在しません。これも正しく内容を読み込む方法ではありません。
- s = fp.read()
- 正しいです。read()メソッドはファイルオブジェクトに対して適用され、ファイルの内容を全て読み込むことができます。このメソッドを使用することで、data1.txtの内容を変数sに格納することができます。
確認問題 3
次のコードを実行した結果として正しいものを選択してください。
fp1 = open("file1")
data1 = fp1.read()
with open("file2") as fp2
data2 = fp2.read()
print(data1)
print(data2)
1、fp2.read()を実行している時点でfp1は閉じられている
2、fp2.read()で例外が発生した時、fp2は閉じられない
3、print(data1)を実行している時点で、fp1もfp2も閉じられている
4、プログラムが終了した時点で、fp1もfp2も閉じられている
答えはコチラをクリック!
答え:4
- 「fp2.read()を実行している時点でfp1は閉じられている」
- 誤りです。fp1はread()メソッドによって全内容が読み込まれているため、fp2.read()を実行する時点ではまだ閉じられていません。withブロックが終了した時点でfp2は閉じられますが、fp1はその後も開いたままです。
- 「fp2.read()で例外が発生した時、fp2は閉じられない」
- 誤りです。with文を使用している場合、ブロック内で例外が発生したとしても、withブロックが終了する際に自動的にfp2は閉じられます。
- 「print(date1)を実行している時点で、fp1もfp2も閉じられている」
- 誤りです。print(data1)を発行する時点では、fp1はすでにread()で使われているため閉じられているが、fp2はまだwithブロック内にいるため、ここではまだ閉じられていません。
- 「プログラムが終了した時点で、fp1もfp2も閉じられている」
- 正しいです。Pythonのガーベジコレクションが動作する前に、fp1は手動で閉じない限り開いたままとなりますが、fp2はwithブロックを抜けることで自動的に閉じられます。プログラム終了時には全てのファイルハンドルは閉じられます。
確認問題 4
次のコードを実行して1行ずつファイルを読み込んで出力します。空欄➀に入る記述として正しいものを選択してください。
fp = open("data.txt")
for s in ➀:
print(s)
1、fp
2、fp.read()
3、fp.readlines()
4、list(fp)
答えはコチラをクリック!
答え:2
- fp
- 正しいです。ファイルオブジェクトfpをループの対象にすると、ファイルを1行ずつ自動的に読み込むことができます。これが最も簡単で一般的な方法です。
- fp.read()
- 誤りです。fp.read()はファイル全体を一度に読み込むメソッドで、文字列として返します。そのため、ループの対象には使えず、for文には適しません。
- fp.readlines()
- 誤りです。fp.readlines()はファイル全体をリストとして読み込み、各行がリストの要素になりますが、ここでリストをループする必要があります。したがって、このままだとエラーになります。
- list(fp)
- 誤りです。list(fp)はファイルのすべての行を読み込んでリストとして返しますが、ループのループ対象には直接使えません。for文ではそのまま実行できないため、不正解です。
次回は…
次回は「017_Pythonエンジニア認定基礎試験8-5~7」です。
ファイルの入出力について学びましょう!
参考資料一覧:Python3エンジニア認定[基礎試験]問題集
https://www.pythonic-exam.com
https://data-engineer-japan.com
https://mynavi-agent.jp
https://python-basic.com
https://www.tokai-bs.co.jp
https://freelance.techcareer.jp/articles/wp/skills/python/detail/550/
https://pythonzen-pep8-exam.jp/