読者です 読者をやめる 読者になる 読者になる

Python のお勉強12 ( ファイルの読み書き )

Python のお勉強シリーズ」第12回目は、ファイルの読み書きを行なうサンプルコードを書いてみました。

まずは、ファイルの読み込みから。

■ fileread.py

#coding: cp932

import locale

#mode="r" で開くと読み込み ( ただし、デフォルトなので特に指定の必要はない )
def fileread1():
    with open("test1.txt") as f:
        for line in f:
            print(line, end="")
            print(line.encode("cp932")) #文字列のバイト列を出力

def fileread1_1():
    from collections.abc import Iterable
    with open("test1.txt") as f:
        print("f:", f)
        print(isinstance(f, Iterable))

#エンコードを指定してファイルを開く
def fileread2():
    with open("test2.txt", encoding="utf-8") as f:
        for line in f:
            print(line, end="")
            print(line.encode("utf-8"))

#fileinput モジュールを使うと複数ファイルを同時に開くことが可能
def fileread3():
    import fileinput as fi
    with fi.input(files=("test3.txt", "test4.txt")) as f:
        for line in f:
            if f.isfirstline(): #ファイルの一行目なら True
                print("---", f.filename(), "---") #ファイル名の出力
            print(line, end="")

if __name__ == "__main__":
    print("----- default locale -----")
    print(locale.getpreferredencoding(False))
    print("----- (1) -----")
    fileread1()
    print("----- (1-1) -----")
    fileread1_1()
    print("----- (2) -----")
    fileread2()
    print("----- (3) -----")
    fileread3()

■ test1.txt / test2.txt / test3.txt / test4.txt

----- test1.txt ( CP932 でエンコードされたファイル ) -----
あいうえお
かきくこけ
さしすせそ

----- test2.txt ( UTF-8 でエンコードされたファイル ) -----
あいうえお
かきくこけ
さしすせそ

----- test3.txt -----
aaaaa
bbbbb
ccccc

----- test4.txt -----
ddddd
eeeee
fffff

■ 実行結果

----- default locale -----
cp932
----- (1) -----
あいうえお
b'\x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8\n'
かきくこけ
b'\x82\xa9\x82\xab\x82\xad\x82\xb1\x82\xaf\n'
さしすせそ
b'\x82\xb3\x82\xb5\x82\xb7\x82\xb9\x82\xbb\n'
----- (2) -----
あいうえお
b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a\n'
かきくけこ
b'\xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91\xe3\x81\x93\n'
さしすせそ
b'\xe3\x81\x95\xe3\x81\x97\xe3\x81\x99\xe3\x81\x9b\xe3\x81\x9d\n'
----- (3) -----
--- test3.txt ---
aaaaa
bbbbb
ccccc
--- test4.txt ---
ddddd
eeeee
fffff

ファイルのオープンは組み込み関数の open() でできます。デフォルトでは読み込みモード ( mode="r"、かつ、テキストモード mode="t") で開くので特にモードの指定は必要ありません。encoding でエンコードの指定が可能ですが、省略した場合は locale.getpreferredencoding(False) で取得できるエンコードが使われるみたいです ( ただし、バイナリモード ( mode="b" ) で開くときは指定しないでね、とのこと )。

for 文に f ( ファイルオブジェクト ) を指定できるのは、こいつが反復可能なオブジェクト (iterable object) だから。fileread1_1() の isinstance(f, Iterable)True になります。

・2. 組み込み関数 — Python 3.4.3 ドキュメント
http://docs.python.jp/3.4/library/functions.html#open

・8. 複合文 (compound statement) — Python 3.4.3 ドキュメント
http://docs.python.jp/3.4/reference/compound_stmts.html#the-for-statement

open() は単一ファイルのオープンにのみ対応してますが、fileinput モジュール使うと複数ファイルを一気にオープンできます。ただし、ドキュメントで input() の mode='r' となっていますので、読み込みモードにしか対応していません。

・11.3. fileinput — 複数の入力ストリームをまたいだ行の繰り返し処理をサポートする。 — Python 3.4.3 ドキュメント
http://docs.python.jp/3.4/library/fileinput.html


続いて書き込みを。

■ filewrite.py

#coding: cp932

#mode="w" で開くと書き込み
def filewrite1():
    with open("output1.txt", mode="w") as f:
        print("あいうえお", file=f)
        print("かきくけこ", file=f)
        print("さしすせそ", file=f)

#mode="a" で開くと追記
def filewrite2():
    with open("output1.txt", mode="a") as f:
        s = input() #ユーザ入力をファイルに書き込む
        print(s, file=f)
    

if __name__ == "__main__":
    filewrite1()
    filewrite2()

■ 実行後の output1.txt の内容 ( ユーザ入力 "たちつてと" )

あいうえお
かきくけこ
さしすせそ
たちつてと

open() で mode="w" を指定すると書き込みモードでオープンできます。ファイルに追記したい場合は mode="a" でオープンします。


駆け足感ありますが、以上です。

[ 環境情報 ]
Windows 7 SP1
Python 3.4.3