ファイルを開く#
教科書 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="")例題2 CSVファイルの処理#
CSV(Comma Separated Values)ファイルは、カンマで区切られた値の集合です。
データ分析の入出力や、表形式のデータを扱うときによく使われます。
単純な CSV ファイルを読み、必要な列のデータのみを出力するプログラムを作成しましょう。
以下のプログラムのTODO部分を埋めて、extract_csv_column.py を完成させてください。
コマンドライン引数で、出力するインデックス番号と、CSVファイルが指定されます。 CSVファイルは複数指定できるようにしてください。
strip関数- 文字列の先頭や末尾にある空白文字(空白、改行、タブ)を削除します。
line.strip()のように、文字列変数(line)に対して呼び出します。
split関数- 文字列の区切り文字(デフォルトはカンマ)で文字列を分割し、リストに変換します。
line.split(",")のように、文字列変数(line)に対して呼び出します。line.split()のように引数を指定しない場合は、空白文字で分割されます。
警告
split関数は、文字列の途中にあるコンマと区切りのコンマを区別しません。
例えば、"Eat, Pray, Love",Julia Roberts,2010という CSV の行を split(",") で分割すると、
['"Eat', ' Pray', ' Love"', 'Julia Roberts', '2010']となり、期待通りにはなりません。このような場合は、csv モジュールを利用するようにしましょう。
csv モジュールについては、この講義の最後の方で紹介します。
import sys
column_index = int(sys.argv[1])
for filename in sys.argv[2:]:
with open(filename, "r") as f:
for line in f.readlines():
line = line.strip() # 行末の改行文字を削除する。
items = # カンマで区切られた値をリストに変換する。
print(items[column_index]) # リストの指定されたインデックスの値を出力する。出力例#
$ python3 extract_csv_column.py 1 products.csv books.csv
単価
150
220
180
著者
宮沢賢治
夏目漱石
夏目漱石サンプルファイル#
products.csv
商品名,単価,個数
りんご,150,3
牛乳,220,1
パン,180,2trips.csv
日付,距離km,時間分
2026-10-01,3.0,20
2026-10-03,2.5,18
2026-10-05,4.0,30books.csv
書名,著者,ページ数
銀河鉄道の夜,宮沢賢治,200
坊っちゃん,夏目漱石,180
こころ,夏目漱石,350🏁 解答例
import sys
column_index = int(sys.argv[1])
for filename in sys.argv[2:]:
with open(filename, "r") as f:
for line in f.readlines():
line = line.strip() # 行末の改行文字を削除する。
items = line.split(",") # カンマで区切られた値をリストに変換する。
print(items[column_index]) # リストの指定されたインデックスの値を出力する。