ロゴ

プログラミング初心者がアプリ開発を目指すブログ

【Python入門】ファイルへの追加書き込み 日本語ファイルの操作 – Python初心者勉強記018

今回は、前回に引き続きファイル操作の方法を見ていきます。ポインタ操作やファイルへの追加書き込み・日本語ファイルの操作方法を解説します。
それでは、やっていきましょう。

ファイルの基本操作(前回からの続き)

ポインタの移動

ファイルオブジェクトのファイルへのポインタを移動するにはseekメソッドを使います。
例えば、途中まで読んだファイルfを、
f.seek(0)とすると再びファイルの最初から読み込めるようになります。
f.seek(2)とすれば、3文字目からファイルを読み込むことができます。


>>> f = open("text.txt","r")
>>> f.read()
'abc\ndef\n'
>>> f.read()
'' #ポインタが終点まで行っているので読み込めない
>>> f.seek(0)
>>> f.read()
'abc\ndef\n'
>>> f.seek(2) 
>>> f.read()
'c\ndef\n' #3文字目から読み込まれる

ファイルの追加書き込み

open関数の引数のモードを’a’にすると、既存のファイルの末尾に追加書き込みをすることができます。


>>> f = open("text.txt","a")
>>> f.write('ghi\n')
>>> f.close()
>>> f = open("text.txt","r")
>>> f.read()
'abc\ndef\nghi\n'

バイナリモードで開く

WindowsやMacではopen関数の引数モードに”b”を追加すると(”rb”,”wb”等)、バイナリモードでファイルを開くことができます。
例えば,Windowsでは「テキストファイルの改行コード」と「プログラム内部の改行コード」が異なるため、読み込みでは”\r\n”を”\n”に変換して読み込み、書き込みのときは”\n”を”\r\n”で出力しています。
このようなファイルデータの変更により、JPEGなどのファイルは破損してしまう可能性があります。このような事態を避けるために、こうしたファイルを読み書きする際には、バイナリモードを使用します。

日本語ファイルの扱い

基本

例えば、文字列を「プログラム上ではユニコード」「ファイル上ではutf8」で扱いたい場合は、第16回で行ったように文字列をエンコード・デコードする必要があります。

codecsモジュールを使う

codecsモジュールを使用すると、上記のような変換を自動的に行うファイルオブジェクトを作成することができます。
codecs.open(ファイルパス,モード,文字コード,エラー)


>>> import codecs
>>> f=codecs.open('temp.txt','w','utf8','ignore')
>>> f.write(u'あいう')
>>> f.close()
>>> print(codecs.open('temp.txt','r','utf8','ignore').read())
あいう

BOM(Byte Order Mark)付き文字列の扱い

BOM(Byte Order Mark)とはUTF-8やUtF-16などの形式を判別するために設けられた、テキストの先頭につけるデータのことです。Windowsのテキストエディタで保存するとBOMが付与されることがあります。
codecsモジュールを使用すると、BOF形式のファイルを作成することができます。
また、BOF付きファイルを読むときは、
codecsモジュールで”utf_8_sig”などのエンコードを指定するか、明示的にBOMを取り除く必要があります。


>>> f=open('temp.txt','w')
>>> f.write(codecs.BOM_UTF8+u' あいう'.encode('utf8','ignore')) #BOM付きファイルの作成
>>> f.close()
>>> open('temp.txt','r').readline().decode('utf8','ignore') #そのまま読むとBOMの部分が出てくる
u'\ufeff\u3042\u3044\u3046'
>>> open('temp.txt','r').readline().lstrip(codecs.BOM_UTF8).decode('utf8','ignore') #.lstrip()でBOMを読み飛ばす
u'\u3042\u3044\u3046'
>>> codecs.open('temp.txt','r','utf_8_sig','ignore').readline() #'utf_8_sig'でBOMを読み飛ばし
u'\u3042\u3044\u3046'

Python入門講座の次の記事はこちら => 【Python入門】パスの構築 ディレクトリの操作- Python初心者勉強記019

スポンサード リンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA