ファイルを開く #
教科書 p.286(Lesson 10)Python でファイルを読み書きするには,open
関数を使います.
open
関数の第1引数が対象のファイル名,第2引数がオープンモードです.
オープンモードは教科書 p.288 表10-1 に記載されていますが,以下の3種類を区別できれば良いでしょう.
モード | 説明 |
---|---|
r |
読み込み専用モードでファイルを開く. |
w |
書き込み専用モードでファイルを開く.ファイルが存在しない場合は新規作成する. |
a |
追記モードでファイルを開く.ファイルが存在しない場合は新規作成する. |
以下のプログラムは sample.txt
を開き,1行ずつ読み込んで出力した後,ファイルを閉じています.
例題1-1 ファイルを読み込む #
f = open("sample.txt", "r") # sample.txt を読み込み専用モードで開く.
for line in f.readlines(): # ファイルの内容を1行ずつ読み込む.
print(line, end="") # 文字列を出力する.print関数は改行付きで出力するので,改行を抑制するために end="" を指定している.
f.close() # 最後にファイルを閉じる.
❓ なぜ end=""
を指定する?
print
関数はデフォルトで改行を出力します.
であれば,行ごとに改行しないと行が分けられないのではないかと思うかもしれません.
しかし,readlines
メソッドで読み込んだ文字列は,元のファイルの行末の改行文字を含んでいます.
そのため,print(line)
であれば,元の改行文字に加えて改行が入るため,各行の下に空行が出力されてしまいます.
だから,end=""
でprint
関数での改行を抑制しているわけです.
f = open("sample.txt", "r") # sample.txt を読み込み専用モードで開く.
print(f.readlines())
f.close()
ファイルに書き込む #
ファイルに書き込むには,open
関数の第2引数に w
オープンモードを指定します.
以下のプログラムは test.txt
に"Hello World!"
という文字列を改行付きで書き込んで,最後にファイルを閉じています.
例題1-2 ファイルに書き込む #
f = open("test.txt", "w") # test.txt を書き込み専用モードで開く.
f.write("Hello World!\n") # ファイルに文字列を書き込む.
f.close() # ファイルを閉じる.
応用 #
with
文
#
ファイルを開いた後,必ず閉じなければいけません.
しかし,ファイルを閉じる処理を忘れないようにとプログラマに注意を求めることで,正しいプログラムにすることは基本的にはよくありません.
人は忘れる生き物であるため,閉じる処理を忘れることを完全には防げません.
そのため,with
文を使ってファイルを利用後,自動的に閉じるようにすることが,実際には推奨されます.
例題1-3 ファイルを読み込む(with
文)
#
# 例題1-1 を with 文を使って書き換えたプログラム.
with open("sample.txt", "r") as f:
for line in f.readlines():
print(line, end="")
ℹ なぜ閉じないといけないのでしょうか
一つのプログラムが開くことができるファイルの数は,OSが制限しています. Pythonプログラムが終了すると,開いていたファイルはインタプリタにより閉じられるため, ファイルを閉じる処理を書き忘れても,大きな問題にはなりにくいです. ただし,大きなプログラムで,ファイルを開いたままにしていると,上記の制限に引っかかり, プログラムが異常終了する可能性があります. そのため,作法として,ファイルを開いたら閉じることを心掛けることが望ましいです.例題 #
例題1 catプログラム #
cat
は Unix 系の OS に標準で備わっているコマンドで,ファイルの内容を表示するコマンドです.
以下の空欄を埋めて,cat
コマンドを模したプログラムを作成してください.
import sys
for filename in sys.argv[1:]: # コマンドライン引数
with open(filename, "r") as f:
# ここで f から1行ずつ読み込んで出力する.
🏁 解答例
with
文の中は,例題1-3と同じです.
import sys
for filename in sys.argv[1:]:
with open(filename, "r") as f:
for line in f.readlines():
print(line, end="")