Python read関数によるファイルのバイト(文字)読み出しの実現

2786 ワード

ファイルオブジェクトは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モードを使用していないため、各文字を順番に読み出し、1文字を読み出すたびにその文字を出力します.
上記のプログラムから見たように、プログラムがファイルを読み終えた後、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()

上記の2つのプログラムでは、open()関数を使用してテキストファイルを開くときに、プログラムが使用する文字セットはどれですか?Windowsプラットフォームなどの現在のオペレーティングシステムの文字セットは常に使用され、open()関数は常にGBK文字セットを使用します.従って、上記のプログラムが読み出すtest.txtもGBK文字セットで保存する必要があります.そうしないと、UnicodeDecodeErrorエラーが発生します.
読み込むファイルで使用される文字セットと現在のオペレーティングシステムの文字セットが一致しない場合は、次の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_test3.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文字セットを使用することを明示的に指定し、ファイルの内容を読み込むときに完全に問題がありません.