ユーニックス総合研究所

  • home
  • archives
  • python-write-file

Pythonでファイルにデータを書き込む3つの方法

  • 作成日: 2021-06-01
  • 更新日: 2023-12-24
  • カテゴリ: Python

Pythonでファイルにデータを書き込む

Pythonでは組み込み関数などを使うことでファイル入出力の処理を書くことができます。
具体的にはopen()とファイルオブジェクトのメソッドを使います。

この記事ではPythonでファイルにデータを書き込む方法を解説します。
結論から言うと↓のようにします。

with open('file.txt', 'w') as fout:  
    fout.write('本日は晴天なり\n')  
    fout.writelines(['本日は\n', '晴天\n', 'なり\n'])  
    # 本日は晴天なり  
    # 本日は  
    # 晴天  
    # なり  

具体的には↓を見ていきます。

  • open()の使い方
  • モードwでファイルを新規作成して書き込み
  • モードaでデータを追記する
  • モードxで常に新規ファイルを開いて書き込み

関連記事

頭が悪い人のPythonのevalの使い方
頭がいい人のPythonのexitの使い方
自作関数read_fileでファイルを読み込み【ファイル入出力, コマンド】
状態遷移による文字列パースのテクニック【Python】
形態素解析で代名詞+助詞+名詞を文章から抜き出す【Python, 自然言語処理, Janome】

open()の使い方

ファイルを開くには組み込み関数のopen()を使います。

open()には第1引数に開きたいファイルのパス、第2引数にファイルのオープンモードを指定します。

open(ファイルのパス, オープンモード)  

ファイルにデータを書き込むには特定のオープンモードを指定して、ファイルを書き込みモードで開く必要があります。
open()はファイルを開くことに成功すると、返り値としてファイルオブジェクトを返します。
このファイルオブジェクトのメソッドを使ってファイルに対してデータを書き込んでいくというのが通常の流れになります。

ファイルの書き込みモードは大きく分けて↓の3つがあります。

  • w ... ファイルを新規作成して開く
  • a ... ファイルを追記モードで開く
  • x ... 常に新規ファイルを開く

↑の内の3つのモードのいずれかを使ってファイルを開くことになります。
つまりファイルにデータを書き込むには↓のような流れが必要になります。

  1. オープンモードを指定してopen()でファイルを開く
  2. ファイルオブジェクトのメソッドを使ってファイルにデータを書き込む

モードwでファイルを新規作成して書き込み

オープンモードのwは常にファイルを新規作成して開きます。
open()の第1引数のパスに指定されているファイルが存在する場合は、そのファイルを空にして開きます。
モードwはファイルを破壊的に開くので注意が必要です。

open()にモードwを指定する場合は↓のようにします。

open(ファイルのパス, 'w')  

ファイルを開く場合はwith文と組み合わせて使うことがあります。
これはwith文がファイルのクローズを自動的にやってくれるからです。
つまり↓のようにしてファイルを開きます。

with open(ファイルのパス, 'w') as ファイルオブジェクト:  
    ここに処理  

モードwでファイルを開いた場合のファイルオブジェクトはio.TextIOWrapperになります。

with open('file.txt', 'w') as fout:  
    print(type(fout))  
    # <class '_io.TextIOWrapper'>  

write()でデータを書き込む

TextIOWrapperの(親クラスの)メソッドwrite()を使うとデータを書き込むことができます。

ファイルオブジェクト.write(書き込むデータ)  

モードwで開いた場合、ファイルのストリーム位置は先頭になっています。
そのためwrite()でデータを書き込むとファイルの先頭からデータが書き込まれます。

with open('file.txt', 'w') as fout:  
    fout.write('本日は晴天なり。')  
    # 本日は晴天なり。  

↑のコードを実行するとfile.txtというファイルが作成されます。
そしてそのファイルに「本日は晴天なり」と書き込まれます。

write()を呼び出すとファイルのストリーム位置が書き込んだバイト数だけ前進します。
そのため連続してwrite()を呼び出すと、データを追記していくことができます。

with open('file.txt', 'w') as fout:  
    fout.write('本日は晴天なり。')  
    fout.write('いい天気ですね。')  
    # 本日は晴天なり。いい天気ですね。  

↑の場合、最初に「本日は晴天なり。」という文字列が書き込まれ、そのあとに「いい天気ですね。」という文字列が追記されます。

writelines()でデータを書き込む

TextIOWrapperの(親クラスの)メソッドwritelines()を使うとリストをファイルに書き込むことができます。

ファイルオブジェクト.writelines(書き込むリスト)  

リストの中身は書き込み可能なデータである必要があります。

with open('file.txt', 'w') as fout:  
    fout.writelines(['本日は\n', '晴天\n', 'なり\n'])  
    # 本日は  
    # 晴天  
    # なり  

↑の場合、['本日は\n', '晴天\n', 'なり\n']というリストがwritelines()に渡されファイルに書き込まれます。
リストの中身の文字列の末尾には改行がくっついてますが、これを取り払うと、書き込まれるデータにも改行が付加されません。
linesと言ってもリスト内の要素ごとに自動で改行を入れたりはしないので注意が必要です。

モードaでデータを追記する

オープンモードのaはファイルを追記モードで開きます。
オープンモードの指定は↓のようにします。

open(ファイルのパス, 'a')  

with文と組み合わせる場合は↓のようにします。

with open(ファイルのパス, 'a') as ファイルオブジェクト:  
    ここに処理  

追記モードで開かれたファイルオブジェクトのメソッドは、常にファイルの末尾にデータを追記します。
追記モードはたとえばログの記録などで利用されることがあります。

write()でデータを追記する

ファイルを追記モードで開いてそのファイルオブジェクトのメソッドwrite()を使うとデータを追記することができます。
↓の例では最初にwモードでファイルを開きデータを書き込み、その後に同じファイルをaモードで開いてデータを追記しています。

with open('file.txt', 'w') as fout:  
    fout.write('これが最初に書き込まれます。\n')  
    # これが最初に書き込まれます。  

with open('file.txt', 'a') as fout:  
    fout.write('これは追記しました。\n')  
    # これが最初に書き込まれます。  
    # これは追記しました。  

↑の場合、最初にwモードで「これが最初に書き込まれます。\n」がfile.txtに書き込まれます。
そのあとにaモードでfile.txtが開かれ「これは追記しました。\n」が追記されます。
結果的にfile.txtの中身は↓のようになります。

これが最初に書き込まれます。  
これは追記しました。  

writelines()でデータを追記する

writelines()でもデータを追記することができます。

with open('file.txt', 'w') as fout:  
    fout.write('これが最初に書き込まれます。\n')  
    # これが最初に書き込まれます。  

with open('file.txt', 'a') as fout:  
    fout.writelines(['これは\n', '追記\n', 'しました。\n'])  
    # これが最初に書き込まれます。  
    # これは  
    # 追記  
    # しました。  

↑の場合、最終的なfile.txtは↓のようになります。

これが最初に書き込まれます。  
これは  
追記  
しました。  

モードxで常に新規ファイルを開いて書き込み

モードxは排他的にファイルを開きます。
排他的というのはなんか難しい言葉ですが、要は「すでにファイルがあったらエラーにする」という意味です。
この仕様のため、モードxでは常に新規ファイルしか開けないようになっています。
すでにファイルが存在する場合はエラーになるためです。

open(ファイルのパス, 'x')  

with文と組み合わせる場合は↓のようにします。

with open(ファイルのパス, 'x') as ファイルオブジェクト:  
    ここに処理  

ファイルがすでに存在する場合はFileExistsErrorが送出されます。

try:  
    open('file.txt', 'x')  
except FileExistsError as e:  
    print(e)  
    # [Errno 17] File exists: 'file.txt'  

write()で排他的にデータを書き込む

xモードにおけるwrite()の使い方はwモードと等価です。
前述の内容を参照してください。

writelines()で排他的にデータを書き込む

xモードにおけるwritelines()の使い方はwモードと等価です。
前述の内容を参照してください。

おわりに

今回はPythonでファイルにデータを書き込む方法を見てみました。
データの書き込みはファイル入出力処理の基本と言えます。

🦝 < 記念カキコ