Pythonの文字列/ファイル操作/組み込み関数(もしくは落ち穂拾い):特集:Visual Studioで始めるPythonプログラミング(2/3 ページ)
Pythonでプログラミングをする上で必須の知識といえる文字列やファイルの扱い方の基本、便利に使える組み込み関数を本稿では紹介する。
ファイル操作
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ステートメントを使うと、ファイル操作の終了時には必ずファイルがクローズされるようになる。closeメソッドを呼び出すのを忘れることがなくなるのは1つのメリットだ。しかし、これにはもう1つ大きなメリットがある。withステートメントを使えば、ファイル操作時に例外が発生しても必ずクローズできるのだ。ファイル操作に例外がつきものであることを考えると、実際のファイル操作は(withステートメントを使わないと)次のようになる。
try:
f = open(……)
# ファイル操作
finally:
f.close()
上で見たようにwithステートメントを使えば、try〜finaly文で囲まずとも確実にファイルをクローズできるようになる。
ここではファイル操作の基本だけを見てきたが、Pythonにはシリアライズ/デシリアライズを行うためのpickleモジュールや、JSON形式のデータを扱うためのjsonモジュールなど、入出力を簡潔に記述するためのさまざまなモジュールも用意されているので、興味のある方は、Pythonのドキュメントを参照してほしい。
最後にPythonの組み込み関数で便利に使えるものを幾つか紹介していこう。
Copyright© Digital Advantage Corp. All Rights Reserved.