Python入門8

****************************************
例外処理
****************************************

try:
    i = input('3を割る数字を入力してください。')
    sub = int(i)
    ans = 3 / sub
except ZeroDivisionError:
    print('0でせ割ることはできません')
except:
    print('その他の例')
else:
    print("例外エラーはありません。")
    print('3 ÷ {0} = {1}'.format(sub, ans))
finally:
    print("finallyは必ず実行される")

 


3を割る数字を入力してください。2
例外エラーはありません。
3 ÷ 2 = 1.5
finallyは必ず実行される

 

 


(1)ZeroDivisionError 0で割り算をした
(2)NameError 識別子が見つからない
(3)TypeError 型が正しくない
(4)IOError ファイル操作などのエラー


(1) 3/0
(2) print(x)    xに値を代入していない
(3) 3 + "4"

 


例外(エラー)を発生させるraise文


raise ZeroDivisionError

 

例外クラスを省略すると
raise

RuntimeErrorを送出する

 

 

 

 

****************************************
ファイル操作
****************************************

open(fileName, mode='r')

オープンモード
'r' 読み込み専用(rtがデフォルト)
'w' 書き出し専用 ファイルが無いときは新規作成
'x' fileで指定したファイルが無ければ開くが、ある場合はエラー
'a' 書き出し専用、ファイルがあれば末尾から追加
'b' バイナリモード
't' テキストモード。(rtがデフォルト)
'+' 更新可能にする。'r+'の場合、読み書き可能、ファイルが無いときはエラー。'w+'の場合、読み書き可能、ファイルが無いときは新規作成。


f=open('abc.txt', 'r', encoding='UTF-8')
xx = f.read()
f.close()
print(xx)


abcd
efgh
ijkl

 

 

一行読みは、readline()を使います。
f=open('abc.txt', 'r', encoding='UTF-8')
print(f.readline())
f.close()


abcd

 

f=open('defg.txt', 'w', encoding='UTF-8')
f.write('xyz')
f.close()

 

seek(offset[,whence])

seekメソッドは、現在位置にoffsetの値を足して、書き出しや読み込みの位置を移動させる。
オプション引数whenceを渡すと、「0」が省略時のデフォルトで「ファイルの先頭から」、「1」が「現在位置から」、「2」が「最後尾から」になる。


バイナリモードでテスト
f=open('abc.txt','rb')
print(f.readline())
print(f.tell())
f.seek(2)
print(f.readline())
f.seek(-3,1)
print(f.readline())

 

 

b'\xef\xbb\xbfabcd\r\n'
9
b'\xbfabcd\r\n'
b'd\r\n'

 

 


#コマンドライン引数を取得するためsyswモジュールをインポート
import sys

try:
    f = open(sys.argv[1], 'r', encoding='UTF-8')
except IOError:
    print(sys.argv[1] + ' : ファイルが開けません。')
else:
    print(f.read())
    f.close()


abcd
efgh
ijki

 


with文

with節の中で例外が発生してもしなくても必ず文が終わるとファイルはクローズする。


#コマンドライン引数を取得するためsysモジュールをインポート
import sys

try:
    with open(sys.argv[1], 'r', encoding='UTF-8') as f:
        print(f.read())
        f.close()
except IOError:
    print('ファイルが開けません。')
else:
    print('ファイルが開けました。')

 

abcd
efgh
ijkl
ファイルが開けました。


「pass」で抜ける
import sys

try:
    with open(sys.argv[1], 'r', encoding='UTF-8') as f:
        pass
except IOError:
    print('ファイルが開けません。')
else:
    print('ファイルが開けました。')

 

ファイルが開けました。

 

ValueError: I/O operation on closed file.
(ファイルは既にクローズしている)