pythonのopen関数を理解する
よく使う割に使い方を把握しきれてなかったので確認してみました。
組み込み関数とは
Pythonには組み込み関数として、Pythonのコアライブラリに組み込まれている関数が存在し、open関数もその一つです。
この組み込み関数は、Pythonインタープリタを起動すると自動的に利用可能になります。
要するにライブラリをimportしなくても使えるということです。
これらはPythonの基本的な操作やデータ型、制御構造、例外処理などをサポートしています。
以下で今回のopen関数含め、どのような組み込み関数があるかやその詳細が確認できます。
open関数の基本
Pythonのopen関数は、任意のファイルを開くために使用されます。
以下はopen関数の基本的な使用方法です。
file = open('filename', 'mode')
第一引数(filename)は開くファイルのファイル名です。
第二引数(mode)は、ファイルを開くためのモードを指定する文字列です。
モード
ファイルに対するアクセス内容に応じてモードを使い分ける必要があります。
基本は以下4パターンです。
「x」は書き込みモードかつ既存のファイルへ影響を与えたくない時に使用します。
指定 | モード | 読み取り | 書き込み | ファイルが存在する場合 | ファイルが存在しない場合 |
---|---|---|---|---|---|
r | read mode | 可能 | 不可 | ファイルの読み取りを行う | FileExistsErrorが発生する |
w | write mode | 不可 | 可能 | ファイルの内容は削除される | 新しいファイルが作成される |
a | append mode | 不可 | 追記のみ可能 | ファイルの末尾に新しいデータが追加される | 新しいファイルが作成される |
x | exclusive creation mode | 不可 | 可能 | FileExistsErrorが発生 | write modeで開かれる |
次に「+」モードを使用することで、読み込みと書き込みを同時に行うことができます。
前述の「r」「w」「a」「x」の後ろに「+」を付与することで指定が可能です。
指定 | モード | 読み取り | 書き込み | ファイルが存在する場合 | ファイルが存在しない場合 |
---|---|---|---|---|---|
r+ | read mode | 可能 | 可能 | ファイルの読み取りを行う | FileExistsErrorが発生する |
w+ | write mode | 可能 | 可能 | ファイルの内容は削除される | 新しいファイルが作成される |
a+ | append mode | 可能 | 追記のみ可能 | ファイルの末尾に新しいデータが追加される | 新しいファイルが作成される |
x+ | exclusive creation mode | 可能 | 可能 | FileExistsErrorが発生 | write modeで開かれる |
Pythonのopen関数には、ファイルを読み書きする際のモードとして、バイナリモード(b)とテキストモード(t)があります。
前述の「r」「w」「a」「x」の後ろに「b」もしくは「t」を付与することで指定が可能です。
たとえば、テキストファイルを読み込む場合は「rt」のように指定します。
また、「+」モードも使用する場合、「r+t」のように指定します。
なお「b」もしくは「t」を付与しなかった場合、デフォルトとしてテキストモード(「t」)でファイルにアクセスします。
指定 | モード | 説明 |
---|---|---|
b | binary mode | ファイル内のデータはバイト列として扱われる バイナリモードでは、ファイルの末尾に自動的に改行コードを追加することはできない 画像ファイル、音声ファイル、動画ファイルなどのバイナリデータを含むファイルを読み書きするために使用される |
t | text mode | ファイル内のデータはASCIIやUnicodeなどの文字コードによってエンコードされたテキストとして扱われる テキストモードでは、ファイルの末尾に自動的に改行コードを追加することができる |
ファイルオブジェクト
open関数で生成されるファイルオブジェクトには、以下のようなメソッドがあります。
メソッド | 説明 |
---|---|
read(size) | ファイルから指定されたバイト数のデータを読み込んで文字列として返す 引数には読み込むバイト数を指定する 引数を省略すると、ファイル全体を読み込む |
readline(size) | ファイルから一行ずつデータを読み込んで文字列として返す 引数には読み込むバイト数を指定する 引数を省略すると、改行文字までの一行を読み込む |
readlines(size) | ファイルからすべての行を読み込んで、行ごとの文字列を要素とするリストを返す 引数には読み込むバイト数を指定する 引数を省略すると、ファイル全体を読み込む |
write(str) | ファイルに文字列を書き込む 引数にはstr型の文字列を指定する |
writelines(sequence) | ファイルに複数の文字列を書き込む 引数には書き込む文字列のリストやタプルなどのシーケンスを指定する |
seek(offset[, whence]) | ファイルポインタを指定された位置に移動する 引数offsetには移動するバイト数を指定する 引数whereには移動基準位置を指定し、0はファイルの先頭、1は現在の位置、2はファイルの末尾を表す 引数whereを省略すると0として扱われる |
tell() | 現在のファイルポインタの位置を返す |
close() | ファイルを閉じる |
open関数使用時のwith文について
Pythonのopen関数使用時には、以下のようにwith文を使用することが推奨されています。
with open('example.txt', 'r') as f:
data = f.read()
print(data)
with文を使用しなくとも以下のようにしてopen関数を使用することは可能です。
f = open('example.txt', 'r')
data = f.read()
print(data)
f.close()
with文の使用が推奨されている理由として、ファイルを自動的に閉じられることが挙げられます。
ファイルを閉じない場合、メモリリークが発生し、プログラムのパフォーマンスに悪影響を与える可能性があります。
後者の実装だと、ファイルを閉じ忘れるリスクがありますが、with文を使用した場合そのようなリスクを回避できます。
サンプルコード
各モードごとに簡単な使用方法を確認していきます。
「r」を使用したファイル読み出し
with open('example.txt', 'r') as f:
data = f.read()
print(data)
「r」を使用したファイルの1行ずつ読み出し
with open('example.txt', 'r') as f:
line = f.readline()
while line:
print(line.strip())
line = f.readline()
「w」を使用したファイル書き込み
with open('example.txt', 'w') as f:
f.write('Hello, world!')
「w」を使用したファイルの1行ずつ書き込み
lines = ['apple\n', 'banana\n', 'cherry\n']
with open('example.txt', 'w') as f:
for line in lines:
f.write(line)
「r+」、seekメソッドを使用し、任意の行へ新しい行を挿入する
inserted_line = "This line was inserted\n"
with open("example.txt", "r+") as f:
lines = f.readlines()
# 第1引数にて挿入したい行を指定
lines.insert(1, inserted_line)
f.seek(0,0)
f.writelines(lines)