サイトトップまとめドキュメントPythonファイルの読み書き ≫ テキストファイルを読み込んで内容を端末に表示

テキストファイルを読み込んで内容を端末に表示

例80 テキストファイルの内容を端末に表示する例

[任意]ファイル名: readtextfile.py エンコーディング: UTF-8

#! /usr/bin/python
# -*- coding: utf-8 -*-

# テキストファイル読み込みのテスト1

import sys

# ファイルの場所を引数に取るようにする
# 必要な引数の数を満たさなければ使用法を表示して終了
if len (sys.argv) < 2:
  print ('使い方: {0} [入力ファイル]'.format (__file__))  # 「__file__」はこのスクリプトの場所
  sys.exit (0)
infile = sys.argv[1]

# ファイルを開くにはopen()関数を用いる
# 1番目の引数に開くファイルの場所,2番目の引数に操作モード(読み込みのみなら「r」という文字列)を指定
# encoding引数はファイルの内容を読み書きする際のエンコーディングで省略時の値は環境依存
# 戻り値(下の場合はf_in)はファイルオブジェクトという型で
# このファイルに対する操作時に使用する
try:
  f_in = open (infile, 'r', encoding='utf-8')         # UTF-8エンコーディングで読み書きする
  #f_in = open (infile, 'r', encoding='cp932')        # CP932エンコーディングで読み書きする
  #f_in = open (infile, 'r', encoding='iso-2022-jp')  # ISO-2022-JPエンコーディングで読み書きする
# 開くのに失敗した場合はIOErrorという例外(通知)が発生する
# 例外が発生した場合にスクリプトが終了しないようにするためにはtry/except節で例外を処理する
# 「file=sys.stderr」は標準エラー出力を用いる指定
except IOError as e:
  print ('エラー: ファイル "{0}" を開けませんでした: {1}'.format (infile, e), file=sys.stderr)
  sys.exit (1)

print ('テキストファイル読み込みのテスト #1')

# 出力の区切り(横線)
print ('-' * 80)

# ファイル内容の行ごとの読み込み処理はループを用いて行う
# 全体を一括で読み込む方法もあり、下のreadline()の代わりにread()を用いる
try:
  while True:  # 無限ループ(ループ内にbreak文がないと終了しない)
    # [ファイルオブジェクト].readline()はファイルから1行を読み込んでそれを戻り値とする
    # 読み込んだ後は読み込み位置が進み、繰り返し呼び出すと次の行,また次の行,と進む
    line = f_in.readline ()
    # 読み込んだものがなければループを抜ける
    if not line:
      break
    # 読み込んだものを表示
    print (line, end='')  # 既に改行を含んでいるので末尾には改行は付けない
# ファイルが開かれていてもread()やreadline()などの実際に読み書きを行う操作の際には
# 処理が失敗する可能性があり、失敗した場合はIOError例外が発生する
except IOError as e:
  print ('エラー: ファイル "{0}" からの読み込みに失敗しました: {1}'.format (infile, e), file=sys.stderr)
# open()でファイルを開いたときにencoding引数が内容のエンコーディングと違う場合には
# 読み込み文字列の中に処理できない文字を含むと読み込み時にUnicodeDecodeError例外が発生する
except UnicodeDecodeError as e:
  print ('エラー: 文字エンコーディングの処理に失敗しました\n (エンコーディング:{0},位置:{1}-{2}): {3}'.format (e.encoding, e.start, e.end, e.reason), file=sys.stderr)
# finally以下は例外が発生した場合にも(いずれの例外も)発生しなかった場合にも実行される
finally:
  print ('-' * 80)
  print ('ファイル "{0}" を閉じます'.format (infile))
  # 重要: ファイルは必要なくなったら[ファイルオブジェクト].close()により閉じる必要がある
  #       この処理は開いたファイルに対して確実に実行されるようにする
  f_in.close ()

print ('終わり')

実行例:

(引数を付けずに実行)
$ [readtextfile.pyの場所]
使い方: [readtextfile.pyの場所] [入力ファイル]

(存在するファイルの場所を指定して実行)
$ [readtextfile.pyの場所] [存在するファイルの場所]
テキストファイル読み込みのテスト #1
--------------------------------------------------------------------------------
(ファイルの内容が表示される)
--------------------------------------------------------------------------------
ファイル "[存在するファイルの場所]" を閉じます
終わり

(open()のencoding引数と異なるエンコーディングのファイルを指定して実行)
$ [readtextfile.pyの場所] [存在するファイルの場所]
テキストファイル読み込みのテスト #1
--------------------------------------------------------------------------------
エラー: 文字エンコーディングの処理に失敗しました
 (エンコーディング:[エンコーディング名],位置:[開始位置]-[終了位置]): invalid start byte
--------------------------------------------------------------------------------
ファイル "[存在するファイルの場所]" を閉じます
終わり

(存在しない場所を指定して実行)
$ [readtextfile.pyの場所] [存在しない場所]
エラー: ファイル "[存在しない場所]" を開けませんでした: [Errno 2] No such file or directory: '[存在しない場所]'

(アクセス権のない場所を指定して実行)
$ [readtextfile.pyの場所] [アクセス権のない場所]
エラー: ファイル "[アクセス権のない場所]" を開けませんでした: [Errno 13] Permission denied: '[アクセス権のない場所]'

(ディレクトリの場所を指定して実行)
$ [readtextfile.pyの場所] [ディレクトリ]
エラー: ファイル "[ディレクトリ]" を開けませんでした: [Errno 21] Is a directory: '[ディレクトリ]'