ファイルオープン
Pythonでのファイルオープン
>>> f = open("/file/path/sample.txt", "r")
どの言語も似たようなものですね。ただ、オープンに失敗した場合も考えると下記のほうが良いのかしら
>>> try: ... f = open("/file/path/sample.txt", "r") ... except IOError: ... print("IOError") ...
「except」で例外を捕捉すべし。あと「finally」句も存在する。Javaと同じだね。で何故だか「else」句もあるんだが、よくわからんな〜なんで例外処理に「else」句があるのか、どういった動作をするのか想像もつかない。
>>> try: ... f = open("/file/path/sample.txt", "r") ... except IOError: ... print("IOError") ... else: ... print("Else statement") ...
当初、この「else」句が、「finally」句に当たるのかと思っていたがちがった。
Pythonのオンラインマニュアル、try文の箇所には「オプションの else 節は、実行の制御が try 節の末尾に到達した場合に実行されます。7.1else 節内で起きた例外は、else 節に先行する except 節で処理されることはありません。」との事。
つまり「try」の処理が正常に動作後、「else」の処理に移るってことですね。また「else」内で発生した例外は、「else」よりも先にある「except」では処理されないって事ですね。わかりました。
>>> f <open file 'sample001.py', mode 'r' at 0x00AF4140> >>> type(f) <type 'file'> >>> dir(f) ['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__getattribute __', '__hash__', '__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__ ', '__repr__', '__setattr__', '__str__', 'close', 'closed', 'encoding', 'fileno' , 'flush', 'isatty', 'mode', 'name', 'newlines', 'next', 'read', 'readinto', 're adline', 'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writeli nes', 'xreadlines']
いつもながら面白い。
>>> f.tell() 0L >>> print(f.read()) --- ファイルの中身が表示される --- >>> f.tell() 572L >>> f.seek(0, 0) >>> f.tell() 0L >>> print(f.read()) --- ファイルの中身が表示される --- >>> f.seek(0) >>> f.tell() 0L
ちょっと遊んでみた。「tell()」でファイルポインタの現在の位置がわかり、「seek()」でファイルポインタを移動でき、「read()」でファイルを一括読み込みするわけだ。他の言語でseekの処理ってもっとややこしかった気がするけど・・・と言うか、特にseek処理って必要なかった気がするな〜なんか簡単にでき驚いている。
「seek()」の第一引数は移動するバイト数、第二引数には、それぞれ「0:ファイルの先頭から(デフォルト値)」「1:ファイルの現在位置から」「2:ファイルの末端から」を取ります。なんだかんだで面白い。
>>> f.name 'sample001.py' >>> f.mode 'r'
なるほど〜でファイルってオープンしたらクローズしたくなるのでクローズする。
>>> f.closed False >>> f.close() >>> f.closed True >>> f.seek(0) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: I/O operation on closed file >>> f.read() Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: I/O operation on closed file >>> f <closed file 'sample001.py', mode 'r' at 0x00AF4140>
ふと思ったんだがクローズする場合、下記のようにしたほうがいいのかな?
>>> if not f.closed: ... f.close() ... f = None ...
とかってやるべきかどうか・・・よくc言語さわっているとやると思うんだが、そういや〜PerlやPHPではやらんね。「close()」だけだよね。あまり深く考えず、「f.close()」だけでいいよね。
・・・最近、Pythonが面白くて仕方がないよ。なんでこんなに面白いんだろう。不思議だ。