2009年10月11日日曜日

ファイルの読み書きをする

組み込み関数openなどでファイルオブジェクトを生成し
readやwriteメソッドで読み書きする
with文を使用すると自動的にファイルをクローズしてくれる

# -*- coding: utf-8 -*-

# ファイルに書き込む
with open("file", "w") as f:
    f.write("ハロー")

# ユニコードの場合はエンコードしてからファイルに書き込む
with open("file", "w") as f:
    us = u"ハロー"
    f.write(us.encode("utf-8"))

# ファイルを読み込む
with open("file", "r") as f:
    print f.read()

# for文を使い1行ずつファイルを読み込む
with open("file", "r") as f:
    for line in f:
        print line

# ファイルオブジェクトを継承する
class A(file):
    pass

エンコーディングを指定してファイルの読み書きする場合は
codecsモジュールを使う
# -*- coding: utf-8 -*-

import codecs

with codecs.open("shift-jis-file", "w", "shift-jis") as f:
    f.write(u"ハロー")

with codecs.open("shift-jis-file", "r", "shift-jis") as f:
    for line in f:
        print line

バイナリデータのファイルを読み書きする場合は
arrayモジュールを使う
import array
import os.path

with open("binary-file", "wb") as f:
    a = array.array("B", [1,2,3,4,5])
    a.tofile(f)

with open("binary-file", "rb") as f:
    a = array.array("B")
    a.fromfile(f, os.path.getsize(f.name))
    print a

with文を使用するには特殊メソッド__enter__と__exit__をクラスに定義し
コンテキストマネージャ型にしなければならない
class A:
    def __enter__(self):
        print "enter"
    def __exit__(self, exc_type, exc_val, exc_tb):
        print "exit"

with A() as a:
    print "hello"

詳細はドキュメントで

1 件のコメント: