Pythonのファイルオープンについて

ファイルオープン

ファイルを読み込んだり、書き込みを行う場合、最初に目的のファイルをopen関数で開きます。 正常に開いたら、readやreadlineなどの関数などでファイルを読み込んだり、書き込んだりします。 処理が完了したらclose関数で開いていたファイルを閉じます。

open

テキストファイルを読み込むだけの場合、第二引数に'r'を指定します。

f = open(tmp_file, 'r')
f.close()
テキストファイルの書き込みは'w'を指定します。 バイナリファイルの場合は、'b'を追加する必要があります。 バイナリファイルを更新するような書き込みでは、'wb'を指定する必要があります。
f = open(tmp_file, 'wb')
# ここでバイナリファイルの書き込み処理を行う。
f.close()

with open

ファイルを開く場合、openとcloseはセットになりますが、closeを自動で行う"with open"を使う方法もあります。

with open('test.txt', 'r')
    for line in f:
        print(line)
print("ここれ以降はファイルが閉じられている")
上記は、with openのブロック終了時にファイルが自動的にクローズされます。ブロックはwith openよりインデントが深い必要があります。

read

ファイルの内容全部を一度に読み込む場合、readメソッドを使用します。

f = open(tmp_file, 'r')
print(f.read())   #=> ファイルの内容を全て出力
f.close()

readlines

ファイルの中身全てを1行ごとにリストにする場合、readlinesメソッドを使用します。

f = open(tmp_file, 'r')
print(f.readline())    #=>  ['The first line\n', 'The second line\n']
f.close()		

readline

ファイルを1行ごとに読み込む場合、readlineメソッドを使用します。

f = open(tmp_file, 'r')
while True:
    line = f.readline()
    if not line:
        break
    print line
f.close()		
上記は古い方法で、今は以下の方法を使用します。
f = open(tmp_file, 'r')
for line in f:
    print(line)
f.close()		

文字コード

日本語などのマルチバイトのファイルを読み込む方法

coding

スクリプトの先頭で、codingを使用して文字コードの設定を行っている場合、 ファイルの文字コードが一致していると、デコード処理がなくても正しく文字コードが 処理されます。

# -*- coding: mbcs -*-

txt_file = 'sjis.txt'
f = open(txt_file, 'r')
for line in f:
    print(line)
f.close()		
これは、Windowsで、シフトJISのスクリプトから、シフトJISのテキストファイルを 開き、中身を出力する例です。

スクリプトがUTF-8の場合は、以下をスクリプトの先頭に付けます

# -*- coding: utf8 -*-

codecs

codecsモジュールを使用すると、指定した文字コードでファイルを開くことができます。

import codecs
f = codecs.open('utf8.txt', 'r', 'utf8', 'ignore')
print(f.read())
f.close()		

シフトJISのスクリプトで、BOM付きUTF-8のファイルを作成する場合、以下のようになります。

# -*- coding: mbcs -*-
import codecs

f = open('tmp_utf8_bom.txt', 'w')
f.write(codecs.BOM_UTF8)
f.write(u'あいう'.encode('utf8', 'ignore'))
f.close()		
UTF-8のファイルの場合、BOM付きがあり、これはファイルの先頭3バイトが 0xEF, 0xBB, 0xBF になります。 Pythonの場合、BOMは codecs.BOM_UTF8 で定義されています。

decode

decodeメソッドを使用すると、指定した文字コードに変換することができます。

f = open('utf8.txt', 'r')
print( f.read().decode('utf8', 'ignore') )
f.close()