特集
» 2017年01月27日 05時00分 公開

Pythonの文字列/ファイル操作/組み込み関数(もしくは落ち穂拾い)特集:Visual Studioで始めるPythonプログラミング(2/3 ページ)

[かわさきしんじ,Insider.NET編集部]

ファイル操作

 Pythonにおけるファイル操作の基本型は、C言語におけるそれとよく似ている。つまり、関数openでファイルを開き(ファイルオブジェクトが返される)、ファイルに対して何らかの処理を行い、ファイルオブジェクトに対するcloseメソッド呼び出しでクローズする。ファイルを開く際にはファイル名とともにモード(読み込み/書き込み/テキストモード/バイナリモードなど)を指定する。

ファイル操作の基本

 以下に簡単な例を示す。ここでは、ファイルをまず作成し、そこにテキストを書き込んでクローズしてから、その内容を読み込んでみる。

f = open('sample.txt', 'w'# 書き込みモードでテキストファイルをオープン
f.write('insider.net')       # テキストの内容をwriteメソッドで書き込み
f.close()                    # ファイルをクローズするにはcloseメソッドを使用
f = open('sample.txt', 'r'# 読み込みモードでオープン
t = f.read()                 # ファイルの内容を読み込み
print(t)


ファイル操作の基本

 対話環境での実行結果は次のようになる。

>>> f = open('sample.txt', 'w')
>>> f.write('insider.net'# writeメソッドは書き込んだ文字数を返送する
11
>>> f.close()
>>> f = open('sample.txt', 'r')
>>> t = f.read()
>>> print(t)
insider.net


対話環境での実行結果

 組み込み関数openの第1引数にはこれから操作を行うファイルの名前を、第2引数にはオープンするモードを指定する。最初のopen呼び出しではファイル名に「sample.txt」を、モードには「'w'」を指定している。「'w'」は書き込みモードを意味する。指定可能なモードとして以下のものがある。

モード 意味
w 書き込み
r 読み込み
x 書き込み。指定したファイルが既に存在している場合は例外が発生
a 追記
b バイナリモード
t テキストモード
+ 更新用に開く(例: 「'r+'」「'a+'」で読み書き両用にオープン可能)
組み込み関数openで指定可能なモード

 デフォルトではテキストモードでオープンされるので、これは省略可能だ(上では「'w'」「'r'」としているが、これは「'wt'」「'rt'」の省略形であり、テキストモードでファイルを開いている)。またテキストモードでは、指定されたエンコーディング方式(デフォルトではプラットフォーム依存)を用いてファイルが読み書きされるとともに、行末コードの変換などが行われる。対してバイナリモードでは、そのような変換が行われずに、データはバイト列として扱われる。

 この例では、ファイルへの書き込みにはwriteメソッドを使用している。このメソッドは「書き込んだ文字数」を返送する。そして、ファイル操作が終わったら、忘れずにcloseメソッドを呼び出す必要がある(が、これを省略して、ファイルのオープン/クローズが対になるような構文も用意されている。後述)。

 ファイルの読み込みにはreadメソッドを使用している。readメソッドはファイルの内容を全て読み込むものだが、1行ごとにファイルを読み込む場合にはreadlineメソッドを利用できる。以下に簡単な例を示す。

f = open('sample.txt', 'w'# 複数行からなるファイルの作成
f.write('insider.net\nbuildinsider')
f.close()
f = open('sample.txt', 'r'# 読み込みモードでオープン
f.read()                     # 全内容を読み込み
f.close()
f = open('sample.txt')       # 第2引数を省略すると読み込みモードでオープン
f.readline()                 # 1行ずつ読み込み
f.readline()                 # 1行ずつ読み込み
f.close()


複数行の読み込み

 対話環境での実行結果を以下に示す。

>>> f = open('sample.txt', 'w')
>>> f.write('insider.net\nbuildinsider')
24
>>> f.close()
>>> f = open('sample.txt', 'r')
>>> f.read()
'insider.net\nbuildinsider'
>>> f.close()
>>> f = open('sample.txt')
>>> f.readline()
'insider.net\n'
>>> f.readline()
'buildinsider'
>>> f.close()


対話環境での実行結果

 ループを使って、ファイルの内容を逐次読み込んでいくことも可能だ。

f = open('sample.txt')
for line in f:
  print(line)
f.close()


ファイルオブジェクトをシーケンスとして利用

 このようにすると、ループごとにファイルの内容が1行ごとに読み込まれる(実行結果は割愛)。

組み込み関数printでのファイルへの書き込み

 本特集ではコンソールへの出力に組み込み関数printを使用してきた。この関数はデフォルトでは標準出力に出力を行うというだけで、実際には上で見たようなファイルへ出力を行うことも可能だ。以下に例を示す。

f = open('sample.txt', 'w')
print('hello world', file=f)  # sample.txtファイルへの出力
f.close()
f = open('sample.txt')
f.read()
f.close()


標準出力からファイルへの切り替え

withステートメント

 withステートメントを使うと、組み込み関数openで開いたファイルをcloseメソッドで閉じるという定型処理を抽象化できる。典型的な例を以下に示す。

f = open('sample.txt', 'w')    # 複数行からなるファイルの作成
f.write('insider.net\nbuild insider')
f.close()
with open('sample.txt') as f:  # オープンしたファイルを表すオブジェクトをfで受け取る
  for line in f:               # 後は上と同様。だが、f.close呼び出しは必要ない
    print(line)


withステートメントの利用例

 withステートメントを使うと、ファイル操作の終了時には必ずファイルがクローズされるようになる。closeメソッドを呼び出すのを忘れることがなくなるのは1つのメリットだ。しかし、これにはもう1つ大きなメリットがある。withステートメントを使えば、ファイル操作時に例外が発生しても必ずクローズできるのだ。ファイル操作に例外がつきものであることを考えると、実際のファイル操作は(withステートメントを使わないと)次のようになる。

try:
  f = open(……)
  # ファイル操作
finally:
  f.close()


ファイル操作をtry〜finally文で囲み、確実にファイルがクローズされるようにする

 上で見たようにwithステートメントを使えば、try〜finaly文で囲まずとも確実にファイルをクローズできるようになる。

 ここではファイル操作の基本だけを見てきたが、Pythonにはシリアライズ/デシリアライズを行うためのpickleモジュールや、JSON形式のデータを扱うためのjsonモジュールなど、入出力を簡潔に記述するためのさまざまなモジュールも用意されているので、興味のある方は、Pythonのドキュメントを参照してほしい。

 最後にPythonの組み込み関数で便利に使えるものを幾つか紹介していこう。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。