pythonのopen関数を理解する

python,組み込み関数

よく使う割に使い方を把握しきれてなかったので確認してみました。

組み込み関数とは

Pythonには組み込み関数として、Pythonのコアライブラリに組み込まれている関数が存在し、open関数もその一つです。

この組み込み関数は、Pythonインタープリタを起動すると自動的に利用可能になります。

要するにライブラリをimportしなくても使えるということです。

これらはPythonの基本的な操作やデータ型、制御構造、例外処理などをサポートしています。

以下で今回のopen関数含め、どのような組み込み関数があるかやその詳細が確認できます。

open関数の基本

Pythonのopen関数は、任意のファイルを開くために使用されます。

以下はopen関数の基本的な使用方法です。

file = open('filename', 'mode')

第一引数(filename)は開くファイルのファイル名です。

第二引数(mode)は、ファイルを開くためのモードを指定する文字列です。

モード

ファイルに対するアクセス内容に応じてモードを使い分ける必要があります。

基本は以下4パターンです。

「x」は書き込みモードかつ既存のファイルへ影響を与えたくない時に使用します。

指定モード読み取り書き込みファイルが存在する場合ファイルが存在しない場合
rread mode可能不可ファイルの読み取りを行うFileExistsErrorが発生する
wwrite mode不可可能ファイルの内容は削除される新しいファイルが作成される
aappend mode不可追記のみ可能ファイルの末尾に新しいデータが追加される新しいファイルが作成される
xexclusive 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」)でファイルにアクセスします。

指定モード説明
bbinary 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)