Up

テキストファイルの読み込みと書き出し

 

計算結果をテキストファイルに書き出したり、テキストファイルとして用意されているデータを読み込むということは、プログラムによる処理では基本的なことである。まず、テキストファイルへの書き出しについて説明する。その後、テキストファイルから読み込みを扱う。

 

 

テキストファイルへの書き出し

 

テキストファイルへの書き出しは、関数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つとして扱われる。

次のスクリプト

 

d = '1 2   3   4'

print(d)

print(d.split())

 

を実行すると、次の出力となる。

 

1 2   3   4

['1', '2', '3', '']

 

 

Home