検索
連載

[Python入門]ファイル操作の基本Python入門(3/3 ページ)

テキストファイルを例に、ファイルのオープン、ファイルに対する読み込みや書き込み、ファイルのクローズなど、ファイル操作の基本を取り上げる。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
前のページへ |       

テキストファイルへの書き込み

 テキストファイルへの書き込みを行う目的でファイルをオープンするには、mode引数を指定する必要がある。以下に本稿の冒頭で示した構文を再掲する(省略したパラメーターについては本稿では触れない)。

open関数

open(file, mode='r')


 fileにオープンするファイルの名前を、modeにオープンするモードを指定する。modeに指定可能な値は以下の通り。

パラメーターmodeに指定可能な値 説明
'r' 読み込み用にオープン(デフォルト値)
'w' 書き込み用にオープン
'a' 追記用にオープン
'x' 排他的生成用にオープン(既にファイルがあるときにはエラーとなる)。ファイルは新規に作成され、書き込み用にオープンされる
'b' バイナリモード(詳細は次回に取り上げる)。'r'、'w'、'a'と一緒に指定する必要がある
't' テキストモード(デフォルト値)。'r'、'w'、'a'と一緒に指定する必要がある
'+' 更新用にオープン。'r'、'w'、'a', 'x'と一緒に指定する必要がある
open関数のパラメーターmode


 これまでの例ではopen関数にはファイル名だけを渡していたので、上の表で「(デフォルト値)」とある'r'と't'が指定されたものとして、テキストモードで読み込み用にファイルがオープンされていた。書き込みを行うには、以下の値を指定できる。

  • 'w':ファイルをオープンして、ファイルサイズを0とする(既存のファイルをオープンした場合、その内容は全て削除される)
  • 'a':ファイルをオープンして、ファイル位置をファイル末尾とする。書き込んだ内容は既存の内容の後に追記される。指定した名前のファイルがなければ新規に作成する
  • 'x':ファイルを排他的に生成する。指定した名前のファイルが既に存在していれば、エラー(FileExistsError例外)となる
  • '+':'r'、'w'、'a'、'x'と一緒に指定する('r+'など)。ファイルを更新する目的でオープンする。開いたファイルは読み込みと書き込みが可能になる

 'r'、'w'、'a'、'x'はいずれか1つだけを指定可能で、'b'、't'もどちらかのみを付加して指定できる(指定しなければ't'が指定されたものと見なされる)。'b'を指定した場合については次回に取り上げる。

 '+'は'r'、'w'、'a'、'x'と一緒に指定して、そのファイルを読み書き両用にオープンする。このときには次のような動作になる。

  • 'r+':既存のファイルの先頭をファイル位置とする。指定した名前のファイルがなければエラーとなる
  • 'w+':ファイルを新規に作成するか、既存のファイルをオープンして、その内容を全て削除する。ファイルの先頭がファイル位置になる
  • 'a+':ファイルを新規に作成するか、既存のファイルをオープンして、末尾をファイル位置とする(新規ファイルの場合はファイル末尾=ファイル先頭となる)
  • 'x+':ファイルを新規作成して、ファイルの先頭をファイル位置とする

 'w'/'a'/'x'と'w+'/'a+'/'x+'の違いは、前者は書き込みのみが可能なことに対して、後者は読み込みと書き込みの両方が可能な点となる。

 ここでは、新規ファイルを作成して、そこに書き込みを行ってみよう。'x'を指定してもよいが、ここでは'w'を使用する(既存ファイルを間違えて消したくないときには'x'を指定すること)。'w'のみを指定しているので、書き込み専用のテキストファイルが作成またはオープン(指定された名前のファイルがある場合)される。ファイル名は「myfile.txt」とする。

myfile = open('myfile.txt', 'w')

書き込みモードでファイルをオープン

 これを実行してから、[File]メニューから[Open]を選択して、ファイル一覧ページを表示してみよう。

ファイルを書き込みモードでオープンするコードを実行
ファイルを書き込みモードでオープンするコードを実行
[File]メニューから[Open]を選択する
[File]メニューから[Open]を選択する
myfile.txtファイルが作成されたことが分かる(下から2つ目)
myfile.txtファイルが作成されたことが分かる(下から2つ目)

ファイル一覧ページでmyfile.txtファイルが作成されたことを確認


 すると、上記画像のようにmyfile.txtファイルができたことが分かるはずだ。

writeメソッド

 次に実際に何かを書き込んでみよう。これにはwriteメソッドを使用するのが簡単だ。writeメソッドにはファイルに書き込みたい「文字列」を渡す。整数など、文字列以外のオブジェクトは渡せないので気を付けよう。

myfile.write('Hello Python\n'# 成功
myfile.write(100# エラー(TypeError例外)

テキストファイルへの文字列の書き込み

 writeメソッドは最後に改行コードを自動的に付加することはないので、1行の内容を1つのwriteメソッドで出力したいときには、上のコードのように最後に改行コードを自分で出力する必要があることにも注意しよう。

 これを実行すると次のようになる。

実行結果
実行結果

 例外メッセージを見ると、TypeError例外が発生しているが、これは整数値「100」を書き込もうとしたからだ。

 数値を書き込みたければ、文字列のformatメソッドf文字列を使用して、それらを文字列に埋め込むようにしよう。以下に例を示す。

myfile.write('{0} * {1} * {2} = {3}\n'.format(1, 2, 3, 1*2*3))
number = 100
myfile.write(f'number is {number}\n')

文字列以外のオブジェクトの値をテキストファイルに書き込むには文字列の書式化を行う

 実行結果を以下に示す。

実行結果
実行結果

 表示されている「14」というのは、最後の「myfile.write(f'number is {number}\n')」行の戻り値だ。writeメソッドは書き込んだ文字数を戻り値と返すが、ここでは実際に書き込まれたのは「number is 100」と改行コードなので、その文字数である「14」が表示されている。

 次に複数の行をまとめて、ファイルに書き込んでみよう。

writelinesメソッド

 テキストファイルに複数の行を書き込むにはwritelinesメソッドが使える。これはリストを引数に取り、その要素を順次テキストファイルに書き込むものだ。writeメソッドと同様に、最後に改行コードを付け加えることはないので、自分で改行コードを追加しておく必要がある。

 以下に例を示す。

mylist = ['Hello Python', '', 'Hello World']
myfile.writelines([item + '\n' for item in mylist])

writelinesメソッドによる複数行の書き込み

 ここではリスト内包表記を使って、各要素の末尾に改行コードを付加した新しいリストを作成して、それをwritelinesメソッドに渡すことで、元のリストの要素を1つの行として出力するようにしている。

バッファリング

 なお、この時点で先ほど開いたファイル一覧ページでmyfile.txtファイルを開いているとどうなるだろう。以下はmyfile.txtファイルを開いてみたところだ。

myfile.txtファイルにはまだ書き込んだ内容が反映されていない
myfile.txtファイルにはまだ書き込んだ内容が反映されていない

 まだファイルにはその内容が書き込まれていない。これは「バッファリング」という機構により、出力がある程度まとまるまで実際のファイル書き込みが行われないようになっているからだ(writeメソッドを呼び出すたびに何度も実際にファイルへの書き込みを行うよりも、書き込むデータがある程度まとまったところで一気に書き込み処理を行った方が効率的であるため)。

 writeメソッドやwritelinesメソッドで書き込みを行ったデータは「バッファー」と呼ばれる領域にため込まれ、何らかのタイミングで実際にファイルに書き込まれる。

 典型的には、closeメソッドでファイルを閉じることで、バッファーの内容が実際にファイルへと書き込まれる(バッファーにたまっているデータを実際にファイルに書き出すことを「フラッシュ」と呼ぶ)。

myfile.close()

ファイルを閉じると、バッファーにたまったデータが実際にファイルへと書き込まれる

 上のコードを実行して、ファイルをクローズしたところで、ファイル一覧ページでmyfile.txtファイルを開くと、今度は書き込んだ内容が表示されているはずだ。

実行結果
実行結果

 flushメソッドを使えば、現在のバッファーの内容を強制的にディスクに書き込めるし、open関数の引数でバッファリング方法を制御することも可能だ。興味のある方は、Pythonのドキュメント「io --- ストリームを扱うコアツール」を参照してほしい。

 ここまではファイルのオープン時のモードに'w'を指定した場合について見た。この場合、既存のファイルをオープンすると、その内容が全てなくなり、ファイル位置はファイルの先頭になる。'a'を指定すると、既存のファイルをオープンするのであれば、それらの内容は全て維持され、ファイル位置がファイル末尾になる。その後のwriteメソッドやwritelinesメソッドの出力は元のファイルへと追記されていく。他のモードについても興味のある方は実際に試してみてほしい。

 最後に付け加えておくと、ファイル操作には例外が付きものだ。これについては回をあらためて紹介したい。

まとめ

 今回はファイルの概要と、テキストファイルの基本的な扱いについて見た。次回はバイナリファイルの扱いを見ていこう。

今回のまとめ

  • ファイルにはさまざまな情報をさまざまなフォーマットで保存できる
  • ファイルには大ざっぱに分けてテキストファイルとバイナリファイルがある
  • Pythonでファイルを開くにはopen関数を使用する
  • ファイル名だけを指定してopen関数を呼び出すと、テキストモードで読み込み用にそのファイルがオープンされる
  • Pythonでテキストファイルを扱う際には、常に文字列がやりとりされる
  • テキストファイルから文字列を読み込むのには、read/readline/readlinesメソッドを使用できる
  • ただし、open関数が返送するファイルオブジェクトは反復可能オブジェクトとしても利用できるので、テキストファイルから各行を読み込んで、逐次的に処理を行うには上記のメソッドを使う必要はない
  • テキストファイルに文字列を書き込むのには、write/writelinesメソッドを使える
  • read/readline/readlines/write/writelinesメソッドを呼び出す際には行末の改行コードの扱いに注意すること

Copyright© Digital Advantage Corp. All Rights Reserved.

前のページへ |       
[an error occurred while processing this directive]
ページトップに戻る