Python read関数はバイト(文字)でファイルを読み込みます。


ファイルオブジェクトは、read()方法を提供しています。ファイルの内容をバイトまたは文字で読み取ります。宇節または文字を読み取るかどうかは、bモードが使用されているかどうかによって異なります。bモードが使用されている場合は、1バイトずつ読みます。bモードが使用されていない場合は、1文字ずつ読みます。この方法を呼び出したとき、最大何バイトまたは宇符を読み取るかを指定するためのパラメータとして整数を導入することができる。
例えば、以下の手順では、ファイル全体を循環的に読み取る内容を採用しています。

f = open("read_test.py", 'r', True)
while True:
  #         
  ch = f.read(1)
  #         ,    
  if not ch: break
  #   ch
  print(ch, end='')
f.close()
上のプログラムはループを使って、各文字を順次読みだします。(プログラムはbモードを使用していませんので)、一つの文字を読み込むごとに、プログラムはその文字を出力します。
上のプログラムから見たように、プログラムがファイルを読み終わったら、すぐにclose()を呼び出してファイルを閉じることを推奨します。資源の流出を防ぐことができます。より安全にファイルを閉じる必要があるなら、ファイルを閉じるclose()方法をfinallyブロックで呼び出すことを推奨します。例えば、上記のプログラムを以下のように変更します。

f =open ("test.txt",'r',True)
try:
  while true:
    #        
    ch = f.read(1)
    #         ,     
    if not ch:break
    #  ch
    print(ch, end='')
  finally:
    f.close() 
この章は主題を強調するために、プログラムを簡略化するために、直接にclose()メソッドを呼び出してファイルを閉じて、finallyブロックを使用しないようにします。
read()メソッドを呼び出した時にパラメータが入らない場合、この方法はデフォルトでファイルの内容を全部読みます。例えば、次のようなプログラムがあります。

f = open("test.txt", 'r', True)
#         
print(f.read())
f.close()
上の二つのプログラムを通して、読者はもう一つの問題を発見したかもしれません。オプン関数を使ってテキストファイルを開くとき、プログラムはどの文字セットを使いますか?常にWindowsプラットフォームなどの現在のオペレーティングシステムの文字セットを使用しており、オプン関数は常にGBK文字セットを使用しています。したがって、上のプログラムで読み取ったtest.txtもGBK文字セットで保存しなければなりません。そうでないと、プログラムはUnicode DecodeErrエラーが発生します。
読み込むファイルの文字セットと現在のオペレーティングシステムの文字セットが一致しない場合、2つの解決方法があります。
  • は、バイナリモードで読み取り、その後、bytesのdecode()方法で文字列に復元する。
  • は、ファイルを開くときに文字セットを指定できるcodecsモジュールのopen()関数を利用してファイルを開く。
  • 以下のプログラムはバイナリモードでテキストファイルを読みます。
    
    #                
    f = open("read_test3.py", 'rb', True)
    #         ,   bytes decode           
    print(f.read().decode('utf-8'))
    f.close()
    
    上記のプログラムは、open()関数を呼び出した時にrbモードに入りました。これはバイナリモードでファイルを読み込むことを示しています。ファイルオブジェクトのread()方法は、bytesオブジェクトを返します。プログラムは、bytesオブジェクトのdecode()メソッドを呼び出して文字列に戻します。このとき読み込んだread_によりtest 3.pyファイルはUTF-8のフォーマットで保存されていますので、プログラムはdecode()メソッドを使って文字列を復元する際に、UTF-8文字セットを明示的に指定する必要があります。
    次のプログラムはcodesモジュールのopen関数を使ってファイルを開きます。文字セットを明示的に指定できます。
    
    import codecs
    #    utf-8          
    f = codecs.open("read_test4.py", 'r', 'utf-8', buffering=True)
    while True:
      #        
      ch = f.read(1)
      #         ,     
      if not ch : break
      #  ch
      print (ch, end='')
    f.close()
    
    上記のプログラムはopen()関数を呼び出した時にUTF-8文字セットを明示的に指定しています。このようにプログラムはファイルの内容を読み取る時には全く問題がありません。