このページでは、ファイルの読み書きに関する基本的な操作について説明します。
Contents
ファイルの読み書き操作の基本
基本フロー
ファイルに対して読み書きといったアクセス操作をする場合、以下の処理が行われます。
- 読み/書きのモードを指定してファイルを開く
- ファイルに対して読み/書きの処理を行う
- ファイルを閉じる
組込みのopen関数を使用すると、ファイルを開きファイルオブジェクトを取得することができます。得られたファイルオブジェクトに対して読み書きを行い、処理が終わったら開いたファイルを閉じます。ただし、後述するコンテキストマネージャを使用と自動的にクローズが実行されます。
ファイルパスについて、カレントディレクトリはPythonスクリプトを実行した場所となります。
ファイルオープンのモード
ファイルを開く際に指定するモードは4つあります。
モード | 意味 |
---|---|
r | 読み込み |
w | 書き込み |
a | 追記 |
b | バイナリ |
t | テキスト(デフォルトでON) |
ファイルの読み込み
テキストファイルを読み込んでみましょう。以下のサンプルコードは実行ディレクトリにsample.txtというテキストファイルを配置してください。
f = open('sample.txt', 'r') # ファイルを開く text = f.read() # ファイルを読み込む print(text) # テキストファイルの内容が出力される f.close() # ファイルを閉じる
ファイルの書き込み
今度はファイルに書き込んでみましょう。
f = open('sample2.txt', 'w') f.write('aaaa bbbb cccc') f.close()
sample2.txtというファイルが作成され、3行目に記述した文字列がファイルに書き込まれます。
上のコードでは、実行するたびにファイルの内容が新たに上書きされてしまいます。追記したい場合は以下のように第2引数に'a'をしていします。
f = open('sample2.txt', 'a')
読み書きする
読み込んだ後、書き込みたい場合は以下のようにr+を指定します。
f = open('sample2.txt', 'r+')
文字コードの指定
encoding引数に文字コードを指定することができます。encodingが指定されていない場合ははプラットフォームに依存します。
対話モードで以下の2コマンドを実行してみてください。お使いの環境のデフォルトのencodingを調べることができます。
$ python >>> import locale >>> locale.getpreferredencoding(False) 'UTF-8'
例えば、sjisを使用したい場合は、以下のように引数に'shift_jis'を指定します。
f = open('sample.txt', 'r', encoding='shift_jis')
with文 コンテキストマネージャ
ファイルを開いた後はcloseが必要ですが、処理中に例外が発生したりするとclose処理が呼び出されず、予期せぬ結果がファイルに出力されたりロックされたままになったりします。こういったことを防ぐため、Pythonにはwith文を使用したコンテキストマネージャという仕組みがあります。
ファイルオブジェクトを扱う処理
以下のサンプルでは、sample.txtを開いて内容を変数textに格納し、printで出力しています。
with open('sample.txt', 'r') as f: text = f.read() print(text)
途中で例外が発生しても、close処理が自動的に呼びだされます。
以下はwith文の代わりにtry/finallyを使用した例です。比較してみると明らかにwith文の方がすっきり記述できまることが分かりますね。
try: f = open('sample.txt', 'r') text = f.read() print(text) finally: f.close()
2020/4/29 サンプルコード中のシングルクォートが’(htmlの一重引用符)になっていたので修正しました。ご連絡くださった方ありがとうございます。
2020/9/25 with文のサンプルコード中でコロンが抜けていたため修正しました。ご連絡くださった方ありがとうございます。