テキストファイルの扱い方

 テキストファイルの使い方を説明していきます。
テキストファイルを使うためには、ワードやExcelなどのアプリケーションと同じように、まずファイルを開く必要があります。そしてテキストファイルの内容について読み書きを行い、他のアプリケーションと同じようにファイルを閉じます。

 ファイルを開く

 ファイルを開くためには、組み込み関数openを使います。open関数はファイルオブジェクトを返してきます。

 open(ファイル名[,モード[,bufsize]])

 ファイル名はカレントディレクトリ(普通スクリプトファイルが入っているフォルダ)内のファイルを指定することが出来ます。モードは下の表のようになっており、ファイルの扱い方が変わってきます。

  モードによるファイルの扱いの違い
モード 読み込み 書き込み 既存ファイルが無かった時 既存ファイルがあった時
"r" × エラーを起こす
"w" × 新規ファイルを作る クリアしてファイルの最初から書
き込む
"a" × 新規ファイルを作る ファイルの最後に追加書き込み
をする
"r+" エラーを起こす クリアせずにファイルの最初から
上書きしていく
"w+" 新規ファイルを作る クリアしてファイルの最初から書
き込む
"a+" 新規ファイルを作る ファイルの最後に追加書き込み
をする

 bufsizeはファイル内容を覚えておくためにどれだけメモリを空けておきますか?という量になります。省略した場合、システム標準値が使われます。システム標準値を使った方が無難だと思います。

 ファイルを閉じる

 ファイルオブジェクトのclose()メゾットを使って、ファイルを閉じることができます。閉じた状態ではファイルにアクセスすることができません。:

 ファイルに書き込む

 ファイルオブジェクトには次の2つの書き込みメゾットがあります。

 F.write(文字列)
 文字列を指定して、ファイルに書き出します。

 F.writelines(シーケンス)
 シーケンスの要素をファイルに書き出します。書き出しを行うとき、改行文字を追加して書き出しません。

インタラクティブシェルを使って、試してみましょう。

 >>> f = open("test.txt","w")
 >>> s = ["ABCDE","FGHIJ","KLMNO","PQRST"]
 >>> f.writelines(s)
 >>> f.close()
 >>> f = open("test.txt","r")
 >>> r = f.readline() ←次に説明するのでフライングを許してください。
 >>> print r
 ABCDEFGHIJKLMNOPQRST ←改行文字が入らないのでご注意を。

 ファイルから読み込む

 ファイルオブジェクトには次の3つの読み込みメゾットがあります。

 F.read([n])
 最大nバイトを読み込みます。nが省かれる場合は、ファイル全体を読み込みます。

 F.readline([n])
 nバイトまでの1行を読み込みます。nが省かれると行全体を読み込みます。

 F.readlines([n])
 readline() を使ってファイル全体を読み出し、リストを返します。もちろん引数を使って最大バイト数を指定することもできます。

 >>> s = ["ABCDE","FGHIJ","KLMNO","PQRST"]
 >>> f = open("test.txt","w")
 >>> for line in s :
 ...   f.write(line+"\n")
 ...
 >>> f.close()
 >>> f = open("test.txt","r")
 >>> for line in f.readlines():
 ...   print line,
 ...
 ABCDE
 FGHIJ
 KLMNO
 PQRST


ファイルから1行づつ読み込んで処理をする
 実はファイルを開き1行ずつ読み込む処理をもっと簡潔に記述することができます。ファイルオブジェクト自体を、for文で使用することができるのです。つまり次のような感じです。

 >>> s = ["ABCDE","FGHIJ","KLMNO","PQRST"]
 >>> f = open("test.txt","w")
 >>> for line in s :
 ... f.write(line+"\n")
 ...
 >>> f.close()
 >>> f = open("test.txt","r")
 >>> for line in f: ←readlines()がなくても動く。
 ...   print line,
 ...
 ABCDE
 FGHIJ
 KLMNO
 PQRST


 ファイルオブジェクトのその他のメゾット

 後2つファイルオブジェクトのメゾットの説明をしたいと思います。

 F.tell()
 ファイル内の現在の見ている位置(ファイルポイント)を返します。

 F.seek(オフセット[,whence])
 オフセットで指定した位置にファイルポイントを移動させます。whenceはオフセットの起点が指定し、"0"の場合はファイルの先頭から、"1"の場合は現在の位置から、"2"の場合はファイルの最後から計算します。whenceが指定されない場合は"0"になります。

  ではインタラクティブシェルで遊んでみましょう。

 >>> s = ["ABCDE","FGHIJ","KLMNO","PQRST"]
 >>> f = open("test.txt","w")
 >>> for line in s :
 ...   f.write(line+"\n")
 ...
 >>> f.close()

 >>> f = open("test.txt","r+")
 >>> f.seek(3)
 >>> f.write("1")
 >>> f.seek(0)
 >>> for line in f:
 ...   print line,
 ...
 ABC1E ←0から数えていって3文字目が"1"に上書きされている。
 FGHIJ
 KLMNO
 PQRST
 >>> f.close()
 >>> f = open("test.txt","a+")
 >>> f.seek(10)
 >>> f.write("2")
 >>> f.seek(0)
 >>> for line in f:
 ...   print line,
 ...
 ABC1E
 FGHIJ
 KLMNO
 PQRST
 2 ←"a+"モードで開いているので書き込みは必ず最後にしかされないようです。


 "r+"モードと"a+"モードの違いが出てきました。個人的には"r+"モードの方が直感的に使いやすいと思うんですが・・・。

 もう一つの書き込み方

 sysモジュールのsys.stdoutを使うとprint文を使って簡単に書き込めます。
 例えばこんな感じです。

#coding: shift-jis

import sys
temp = sys.stdout ←標準出力を一時的にキープします。
sys.stdout = open("test.txt","w")

print "Hello World"

sys.stdout.close()

sys.stdout = temp ←標準出力に戻します。
print "プログラムを終了します。"

raw_input()

出力画面:
 プログラムを終了します。
 インタラクティブシェルで確かめてみましょう。

 >>> f = open("test.txt","r")
 >>> for line in f:
 ...   print line,
 ...
 Hello World

 私が初めて知った時は「こんなに簡単なら一番最初に書いて欲しい」って感じでした。