ファイルオープン

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言語さわっているとやると思うんだが、そういや〜PerlPHPではやらんね。「close()」だけだよね。あまり深く考えず、「f.close()」だけでいいよね。

・・・最近、Pythonが面白くて仕方がないよ。なんでこんなに面白いんだろう。不思議だ。