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" でオープンします。
駆け足感ありますが、以上です。