知ることはたのしい

"車輪の再発明"は時間がもったいないと思うから"車輪の設計図"を置いて学習の効率化に役立ちたい。そしてもっと素晴らしいものを開発してくれないかな。

ぼくがよく調べるPythonの基礎の基礎(ファイル入出力)

Pythonを知ってからプログラムを書く必要があれば大抵はPythonを使っているのですが
毎回同じようなことを調べてしまうし、大学でも周囲にPythonの勧めているので初心者向けにまとめてみました。
対象としている環境はPython-2.7系です。

ファイル入出力

ファイルを開く

f=open('filename','r')  

'r':読み込み, 'w':書き込み, 'a':追記
バイナリファイルを扱う場合は上記の文字に'b'をつけます。
'r'の場合はファイルが存在していない場合エラーになります。
読み書きを同時に行いたい場合は'r+'などのように'+'をつけるのですが、 'r+','w+','a+'は処理が微妙に異なります。
実際に実行しつつ確認したことなので差異はこれが全てだとは限らないかもしれませんが、以下のようになっています。
'r+':readなどで移動した現在の位置に上書き(初期位置はファイル先頭)
'w+':一度ファイルの中身をクリアしてから読み書き
'a+':読み出しは'r'と同じ(ただし初期位置はファイル末尾)書き込みは必ず末尾に追記

ファイルの読み込み

f.read()
f.readline()
f.readlines()

ファイルの読み込みでよく使う関数はこの3つです。 read()はファイルを現在の位置からすべて読み込んで文字列とします。引数に数値を与えると最大でそのサイズだけ読み込みます。
readline()ファイルを1行ずつ読み込む時に使います。引数は上と同じです。
readlines()はファイルを現在の位置からすべて1行ずつ読み込んでリストに格納してくれます。

さて、実際にプログラムを書くときに注意すべきことは読み込んだ際、改行記号などが残り続けることです。
次のようにfor文を使っても1行ずつ処理を行え、strip()で改行記号を除いています。

#ex1
for line in f:
    s = line.strip() #文字列の先頭と末尾から空白,改行記号を取り除いたものを返す
    #処理....
#ex2
#改行を取り除く以外の処理を個々にするつもりがない場合はこちらのほうが楽かもしれないです
s = f.readlines()
s = map(lambda n:n.strip(), s)

ex2では、ファイル全体をリストにした後mapを使ってリスト全体に処理をかけています。
ここで用いているlambda式はこの項の本質ではないので簡単に済まさせていただきますが、 無名関数を表現する記法で、lambda '引数':'返り値'であることを認識していただければよいです。 さらにf.readlines()mapの第2引数に入れてあげれば、"わずか1行"でファイルの読み込みが出来ます。

ファイル書き込み

f.write(str)
f.writelines(list)

write(str)は文字列をファイルに出力します。文字列に改行記号が含まれていなければ改行はされません。
writelines(list)['aaa', 'bbb','ccc']などの文字列からなるリストをaaabbbcccのように出力します。
これらの関数は書式指定ができるので改行など自由に体裁を整えられます。

#ex3
n = '1'
f.write("%s\n" %n)

この1記事に全て書ききるつもりだったのですが、思いの外長くなり...
次回以降に他の機能についても書いていきたいと思います。