テキストファイルの読み込みと書き出し
計算結果をテキストファイルに書き出したり、テキストファイルとして用意されているデータを読み込むということは、プログラムによる処理では基本的なことである。まず、テキストファイルへの書き出しについて説明する。その後、テキストファイルからの読み込みを扱う。
テキストファイルへの書き出しは、関数openによりファイルオブジェクトを作成して、ファイルオブジェクトのwrite関数により行うことができる。例をリスト1に示す。
リスト1 テキストファイルへの書き出し
Ls = ['a', 'b', 'c']
nums = [1, 2, 3]
for a, b in zip(Ls, nums):
print(a, b)
f = open('myfile.txt', 'w')
# ファイルオブジェクトの生成
for a, b in zip(Ls, nums):
f.write(a
+ f' {b}' + '\n')
# fの関数writeによる書き出し
f.close()
# ファイルオブジェクトを閉じる
print()
for a, b in zip(Ls, nums):
print(a, b, end='')
ファイルオブジェクトの作成は次のコードで行っている。
f = open('myfile.txt', 'w')
関数openの第1引数に書き出しのテキストファイル名を設定して、第2引数に'w'を設定する。ファイル名は任意であるが、テキストファイルであるので、ファイル拡張子は「.txt」としておくと扱い易い。
ファイルへの書き出しはファイルオブジェクトの関数writeにより行っている。
f.write(a + f' {b}' + '\n')
関数writeの引数には出力する文字列を設定する。出力先で復帰改行を行うときは、文字列'\n'を出力すると、その位置で復帰改行が行われる。
ファイルへの出力が終了すれば、関数closeを実行して、ファイルオブジェクトを閉じる。
f.close()
ファイルへの出力は、一旦バッファーに蓄えてから行われる。したがって、このファイルを閉じる処理を行わずにプログラムを終了すると、ファイルに書き出したはずのものがバッファーに残ったままになり、ファイルには転送されずにプログラムが終了することがある。
関数printは、実行の最後で復帰改行が行われるが、復帰改行を行わないときは、引数end=’’を設定すればよい。
次のスクリプト
for a, b in zip(Ls, nums):
print(a, b, end='')
を実行したときの出力は次のようになる。
a 1b 2c 3
リスト1のスクリプトの実行で書き出されるファイルは、リスト1のスクリプトファイルと同じフォルダ内に作成される。エディタで開くと図1のようになっている。
図1
テキストファイルを読み込むときは、関数openの第2パラメータに'r'を設定する。テキストファイルからの読み込みの例をリスト2に示す。
リスト2 テキストファイルからの読み込み
f = open('myfile.txt', 'r') # テキストファイルからの読み込み用ファイルオブジェクト
data_ln = f.readlines()
f.close()
print(data_ln)
v_sum = 0
i_sum = 0
for v in data_ln:
v_1 = v.split()
# 空白文字で区切られた文字列の取り出し。\nも除去される。
print(v_1)
v_sum
+= float(v_1[1]) # 数値を表す文字列をその表す数値に変換
i_sum
+= int(v_1[1])
print(v_sum)
print(i_sum)
次のコードは、
f =
open('myfile.txt', 'r')
リスト1の実行で作成したテキストファイル'myfile.txt'からの読み込み用ファイルオブジェクトを用意するものである。
次のコード
data_ln = f.readlines()
の実行により、ファイルの内容が一括して読み込まれ、リストとして表される。
これは、次のコード
print(data_ln)
の出力が次のようであることで確認できる。
['a 1\n', 'b
2\n', 'c 3\n']
次のスクリプトにより、上のリスト内の文字列を1つずつ取り出して、文字列内の空白文字(半角)で区切られた項目を関数で取り出してリストにしている。
for v in data_ln:
v_1 = v.split()
# 空白文字で区切られた文字列の取り出し。\nも除去される。
print(v_1)
print(v_1)の出力は以下のようである。
['a', '1']
['b', '2']
['c', '3']
各文字列の最後の\nも削除されている。
数値は文字列として扱われているので、数値として計算するためには、その表す数値に変換する必要がある。リスト2では、次のコードで変換している。
v_sum += float(v_1[1])
i_sum += int(v_1[1])
関数splitでは、複数の連続する空白は1つとして扱われる。
次のスクリプト
a = '1 2 3 4 5'
print(a)
print(a.split())
を実行すると次の出力を得る。
1 2 3 4 5
['1', '2', '3', '4', '5']
区切り文字はコンマ,でもよいが、コンマが続くとその間に何もない項目が設定される。
次のスクリプト
b = '1,2,,,,3,,,,4,5'
print(b)
print(b.split(','))
を実行すると、以下の出力を得る。
1,2,,,,3,,,,4,5
['1', '2', '', '', '', '3', '', '',
'', '4', '5']
区切り文字は、全角の空白文字でもよい。
次のスクリプト
c = '1 2 3'
print(c)
print(c.split())
を実行すると、以下の出力となる。
1 2 3
['1', '2', '3']
空白文字は、半角と全角が混在していても1つとして扱われる。
次のスクリプト
d = '1 2 3 4'
print(d)
print(d.split())
を実行すると、次の出力となる。
1 2 3 4
['1', '2', '3', '4']