Pythonのprint関数でファイル出力する方法を徹底解説

Pythonでプログラムを作っていると、「計算結果をファイルに保存したい」「ログを記録しておきたい」といった場面に出くわしますよね。

普段使っているprint関数は、画面に文字を表示するためのものだと思っていませんか?実は、ちょっとした工夫でファイルに出力することもできるんです!

今回は、print関数を使ってファイルに出力する方法を、基本から応用まで分かりやすく解説していきます。

スポンサーリンク

print関数の基本

まず、通常のprint関数の使い方を復習しておきましょう。

画面に出力する基本的な使い方

print("Hello, Python!")
print("こんにちは", "世界")

実行結果:

Hello, Python!
こんにちは 世界

このように、print関数に渡した文字列や値が、コンソール(画面)に表示されます。

print関数のパラメータ

print関数には、いくつかの便利なパラメータがあります。

sep(区切り文字):
複数の値を渡したとき、値と値の間に入る文字を指定できます。デフォルトは半角スペースです。

print("apple", "banana", "orange", sep=", ")

実行結果:

apple, banana, orange

end(末尾文字):
print関数の最後に追加される文字を指定できます。デフォルトは改行(\n)です。

print("Hello", end=" ")
print("World")

実行結果:

Hello World

これらのパラメータに加えて、今回の主役となるfileパラメータがあります。

ファイルに出力する基本方法

print関数のfileパラメータを使うと、画面ではなくファイルに出力できます。

基本的な書き方

# ファイルを書き込みモードで開く
f = open('output.txt', 'w')

# ファイルに出力
print('Hello, Python!', file=f)
print('ファイルに書き込まれました', file=f)

# ファイルを閉じる
f.close()

このコードを実行すると、output.txtというファイルが作成され、以下の内容が書き込まれます。

Hello, Python!
ファイルに書き込まれました

コードの説明

ステップ1: ファイルを開く

f = open('output.txt', 'w')

open関数でファイルを開きます。第2引数の'w'は「書き込みモード」を意味します。

ステップ2: ファイルに出力

print('Hello, Python!', file=f)

print関数のfileパラメータに、開いたファイルオブジェクトfを指定します。

ステップ3: ファイルを閉じる

f.close()

ファイルを閉じないと、データが正しく書き込まれない可能性があります。必ず閉じましょう。

with文を使った安全な書き込み

ファイル操作では、with文を使う方が安全です。

with文の基本

with open('output.txt', 'w') as f:
    print('Hello, Python!', file=f)
    print('with文を使った出力', file=f)

with文のメリット

自動的にファイルを閉じてくれる:
withブロックを抜けると、自動的にファイルが閉じられます。close()を書き忘れる心配がありません。

エラーが発生しても安全:
処理中にエラーが起きても、ファイルは必ず閉じられます。

推奨される書き方

with open('output.txt', 'w', encoding='utf-8') as f:
    print('日本語のテキスト', file=f)
    print('文字化けしません', file=f)

encoding='utf-8'を指定すると、日本語の文字化けを防げます。

ファイルを開くモードの違い

ファイルを開くときのモードには、いくつか種類があります。

主なモード一覧

‘w’ (書き込みモード – write):

  • 新しくファイルを作成して書き込む
  • 既存のファイルがある場合は、内容を消して上書きする
with open('output.txt', 'w') as f:
    print('最初の行', file=f)

# もう一度実行すると...
with open('output.txt', 'w') as f:
    print('上書きされた!', file=f)

ファイルの内容は「上書きされた!」だけになります。

‘a’ (追記モード – append):

  • ファイルの末尾に追加で書き込む
  • 既存の内容は残る
with open('output.txt', 'a') as f:
    print('1行目', file=f)

with open('output.txt', 'a') as f:
    print('2行目', file=f)

ファイルの内容:

1行目
2行目

‘r’ (読み込みモード – read):

  • ファイルを読み込み専用で開く
  • デフォルトのモード(省略可)

‘r+’ (読み書き両用モード):

  • ファイルの読み込みと書き込みの両方ができる

モードの選び方

用途に応じて適切なモードを選びましょう。

ログファイルを作りたい:
→ 追記モード'a'を使う

設定ファイルを更新したい:
→ 書き込みモード'w'を使う

処理結果を毎回新しく保存したい:
→ 書き込みモード'w'を使う

文字コード(エンコーディング)の指定

日本語などの全角文字を扱うときは、文字コードを指定する必要があります。

文字化けの原因

Windowsでは、デフォルトの文字コードが環境によって異なる場合があります。文字コードを指定しないと、以下のようなエラーが発生することがあります。

UnicodeDecodeError: 'cp932' codec can't decode byte...

UTF-8の指定方法

with open('output.txt', 'w', encoding='utf-8') as f:
    print('日本語テキスト', file=f)
    print('こんにちは世界', file=f)

encoding='utf-8'を必ず指定しましょう。UTF-8は、世界中のほとんどの文字を扱える標準的な文字コードです。

その他の文字コード

状況に応じて、他の文字コードを使うこともあります。

# Shift_JISで保存(Windowsの古いシステム用)
with open('output.txt', 'w', encoding='shift_jis') as f:
    print('Shift_JISで保存', file=f)

ただし、特別な理由がない限りは、UTF-8を使うのが推奨されます。

複数の値を出力する

print関数は、複数の値をまとめて出力できます。

基本的な複数値の出力

with open('output.txt', 'w', encoding='utf-8') as f:
    name = "太郎"
    age = 25
    city = "東京"

    print(name, age, city, file=f)

ファイルの内容:

太郎 25 東京

区切り文字を指定する

with open('output.txt', 'w', encoding='utf-8') as f:
    print("りんご", "バナナ", "オレンジ", sep=", ", file=f)

ファイルの内容:

りんご, バナナ, オレンジ

CSV形式で出力する

with open('data.csv', 'w', encoding='utf-8') as f:
    # ヘッダー行
    print("名前", "年齢", "都市", sep=",", file=f)

    # データ行
    print("太郎", 25, "東京", sep=",", file=f)
    print("花子", 30, "大阪", sep=",", file=f)

ファイルの内容:

名前,年齢,都市
太郎,25,東京
花子,30,大阪

改行の制御

print関数の末尾の改行を制御できます。

デフォルトの動作

with open('output.txt', 'w', encoding='utf-8') as f:
    print("1行目", file=f)
    print("2行目", file=f)

ファイルの内容:

1行目
2行目

各print文の後に自動的に改行が入ります。

改行を入れない

with open('output.txt', 'w', encoding='utf-8') as f:
    print("こんにちは", end="", file=f)
    print("世界", file=f)

ファイルの内容:

こんにちは世界

end=""を指定すると、末尾の改行が入りません。

カスタム末尾文字

with open('output.txt', 'w', encoding='utf-8') as f:
    print("行1", end=" | ", file=f)
    print("行2", end=" | ", file=f)
    print("行3", file=f)

ファイルの内容:

行1 | 行2 | 行3

実践的な例

実際の使用例をいくつか紹介します。

例1: ログファイルの作成

import datetime

def write_log(message):
    with open('app.log', 'a', encoding='utf-8') as f:
        timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        print(f"[{timestamp}] {message}", file=f)

# 使用例
write_log("プログラムを開始しました")
write_log("データを処理中...")
write_log("処理が完了しました")

app.logの内容:

[2026-01-08 10:30:15] プログラムを開始しました
[2026-01-08 10:30:16] データを処理中...
[2026-01-08 10:30:20] 処理が完了しました

例2: 計算結果の保存

with open('results.txt', 'w', encoding='utf-8') as f:
    print("=== 計算結果 ===", file=f)
    print("", file=f)  # 空行

    for i in range(1, 6):
        result = i * i
        print(f"{i}の2乗 = {result}", file=f)

results.txtの内容:

=== 計算結果 ===

1の2乗 = 1
2の2乗 = 4
3の2乗 = 9
4の2乗 = 16
5の2乗 = 25

例3: データの一覧を出力

students = [
    {"name": "太郎", "score": 85},
    {"name": "花子", "score": 92},
    {"name": "次郎", "score": 78}
]

with open('scores.txt', 'w', encoding='utf-8') as f:
    print("生徒名\tスコア", file=f)
    print("-" * 20, file=f)

    for student in students:
        print(f"{student['name']}\t{student['score']}", file=f)

scores.txtの内容:

生徒名    スコア
--------------------
太郎    85
花子    92
次郎    78

例4: 九九の表をファイルに出力

with open('kuku.txt', 'w', encoding='utf-8') as f:
    print("=== 九九の表 ===", file=f)
    print("", file=f)

    for i in range(1, 10):
        for j in range(1, 10):
            print(f"{i} × {j} = {i*j:2d}", end="  ", file=f)
        print("", file=f)  # 行の終わりで改行

write()メソッドとの違い

ファイルに書き込む方法として、write()メソッドもあります。

write()メソッドの使い方

with open('output.txt', 'w', encoding='utf-8') as f:
    f.write('Hello, World!')
    f.write('2行目')

ファイルの内容:

Hello, World!2行目

改行が自動で入らないことに注意してください。

print()とwrite()の比較

print関数の特徴:

  • 自動的に改行が入る
  • 複数の値を簡単に出力できる
  • 値を自動的に文字列に変換してくれる
with open('output.txt', 'w', encoding='utf-8') as f:
    print(123, "abc", True, file=f)  # 全部文字列に変換される

write()メソッドの特徴:

  • 文字列しか書き込めない
  • 改行は自分で追加する必要がある
  • より細かい制御ができる
with open('output.txt', 'w', encoding='utf-8') as f:
    f.write('1行目\n')
    f.write('2行目\n')

どちらを使うべき?

print関数を使うべき場合:

  • ログやデバッグメッセージを書き込むとき
  • 複数の値をまとめて出力したいとき
  • 手軽にファイル出力したいとき

write()メソッドを使うべき場合:

  • 改行を細かく制御したいとき
  • バイナリデータを扱うとき
  • パフォーマンスが重要なとき(大量のデータ)

一般的には、print関数の方が使いやすいので、特別な理由がない限りprint関数を使いましょう。

標準出力のリダイレクト

すべてのprint文の出力先を一時的にファイルに変更する方法もあります。

sys.stdoutを使った方法

import sys

# 元の標準出力を保存
original_stdout = sys.stdout

# 標準出力をファイルにリダイレクト
with open('output.txt', 'w', encoding='utf-8') as f:
    sys.stdout = f

    print('この行はファイルに書き込まれます')
    print('こちらもファイルです')

# 標準出力を元に戻す
sys.stdout = original_stdout

print('この行は画面に表示されます')

contextlibを使った方法

from contextlib import redirect_stdout

with open('output.txt', 'w', encoding='utf-8') as f:
    with redirect_stdout(f):
        print('ファイルに出力')
        print('こちらもファイル')

print('画面に表示')

この方法は、既存のコードを変更せずにファイル出力に切り替えたい場合に便利です。

よくあるエラーと対処法

ファイル出力でよく発生するエラーと、その解決方法を紹介します。

エラー1: ファイルが見つからない

# エラーが発生するコード
with open('folder/output.txt', 'w') as f:
    print('テスト', file=f)

エラーメッセージ:

FileNotFoundError: [Errno 2] No such file or directory: 'folder/output.txt'

原因:
指定したフォルダ(folder)が存在しない。

対処法:

import os

# フォルダを作成してから書き込む
os.makedirs('folder', exist_ok=True)
with open('folder/output.txt', 'w', encoding='utf-8') as f:
    print('テスト', file=f)

エラー2: 文字化けする

原因:
文字コード(エンコーディング)が正しく指定されていない。

対処法:

# 必ずencoding='utf-8'を指定する
with open('output.txt', 'w', encoding='utf-8') as f:
    print('日本語テキスト', file=f)

エラー3: ファイルが空になる

# ファイルが空になってしまう例
f = open('output.txt', 'w', encoding='utf-8')
print('テスト', file=f)
# close()を忘れている!

原因:
close()を呼び出していないため、バッファの内容がファイルに書き込まれていない。

対処法:

# with文を使う(推奨)
with open('output.txt', 'w', encoding='utf-8') as f:
    print('テスト', file=f)

# またはclose()を必ず呼ぶ
f = open('output.txt', 'w', encoding='utf-8')
print('テスト', file=f)
f.close()

エラー4: 既存のファイルが上書きされてしまう

原因:
書き込みモード'w'を使うと、既存のファイルが削除される。

対処法:

# 追記モードを使う
with open('output.txt', 'a', encoding='utf-8') as f:
    print('追加の行', file=f)

パフォーマンスの考慮事項

大量のデータを書き込む場合の注意点です。

何度もファイルを開閉しない

悪い例:

# 非効率な書き方
for i in range(1000):
    with open('output.txt', 'a', encoding='utf-8') as f:
        print(f'行 {i}', file=f)

良い例:

# 効率的な書き方
with open('output.txt', 'w', encoding='utf-8') as f:
    for i in range(1000):
        print(f'行 {i}', file=f)

1回だけファイルを開いて、その中でループ処理する方が高速です。

バッファリングを活用する

# バッファサイズを指定(1MB)
with open('output.txt', 'w', encoding='utf-8', buffering=1024*1024) as f:
    for i in range(10000):
        print(f'データ {i}', file=f)

大量のデータを書き込む場合は、バッファサイズを大きくすると高速化できます。

まとめ

Pythonのprint関数を使ったファイル出力について解説しました。

重要なポイント:

  • print関数のfileパラメータでファイルに出力できる
  • with文を使うと安全にファイル操作ができる
  • 'w'モードは上書き、'a'モードは追記
  • 日本語を扱う場合はencoding='utf-8'を指定する
  • 複数の値はsepパラメータで区切り文字を指定できる
  • 末尾の改行はendパラメータで制御できる
  • write()メソッドよりprint()の方が手軽
  • ファイルは必ず閉じる(with文なら自動)
  • 大量のデータを書き込むときは、ファイルを1回だけ開く

基本的な書き方のテンプレート:

with open('output.txt', 'w', encoding='utf-8') as f:
    print('ここにテキストを書く', file=f)

このシンプルな書き方を覚えておけば、ほとんどの場面で対応できます。

ファイル出力は、プログラムの実行結果を記録したり、データを保存したりする際に欠かせない技術です。ぜひ実際のプログラムで活用してみてください!

参考情報:

  • Python公式ドキュメント: https://docs.python.org/ja/3/tutorial/inputoutput.html

コメント

タイトルとURLをコピーしました