Pythonでテキストファイルに文字列を書き込む基本を、最小のコードから実務で迷わない書き方まで順序立てて解説します。
上書きと追記の違い、改行の扱い、文字化けを防ぐためのエンコーディング指定、さらにprint(file=...)
による手軽な書き込みまで、初心者の方でも再現できる形で丁寧に説明します。
Pythonでテキストファイルに書き込む基本
open()とwrite()の最小コード
テキストファイルに書き込む基本は、open
でファイルを開き、write
で文字列を書き込み、最後にclose
で閉じる流れです。
実務ではファイルを確実に閉じるためwith
構文の使用が推奨ですが、ここではまず最小コードを示します。
# 最小の書き込み例: open → write → close
# ポイント:
# - "w"は書き込みモード(既存ファイルは上書きされます)
# - encoding="utf-8"は文字化け対策として強く推奨です
f = open("hello_basic.txt", "w", encoding="utf-8")
f.write("こんにちは、Python!\n") # 文字列を書き込む。戻り値は書き込んだ文字数
f.close() # 明示的に閉じる
print("書き込み完了")
書き込み完了
補足として、例外が起きても確実にファイルを閉じるためwith open(...)
の使用が安全です。
詳しい解説は別記事としますが、同じ処理を安全に書くと次のようになります。
# with構文を使う安全な書き方(参考)
with open("hello_with.txt", "w", encoding="utf-8") as f:
f.write("withで安全に書く例です。\n")
print("書き込み完了")
書き込み完了
複数行の書き込み(ループ/writelines)
ループで1行ずつwriteする
複数行を扱う場合は、1行ずつwrite
で書くのが分かりやすいです。
各行の末尾に\n
を忘れずに入れます。
# 複数行をループで書き込む例
lines = ["1行目", "2行目", "3行目"]
with open("multi_lines_loop.txt", "w", encoding="utf-8") as f:
for line in lines:
f.write(line + "\n") # 各行に改行を付ける
# 書けた内容を確認(学習のため読み出し)
with open("multi_lines_loop.txt", "r", encoding="utf-8") as f:
print(f.read(), end="")
1行目
2行目
3行目
writelinesでまとめて書く
writelines
はリストなど反復可能オブジェクトをまとめて書き込みます。
ただし改行は自動で入りませんので、必要なら各要素に\n
を付けます。
# writelinesでまとめて書く例(各要素に改行を含める)
lines = ["A\n", "B\n", "C\n"]
with open("multi_lines_writelines.txt", "w", encoding="utf-8") as f:
f.writelines(lines)
with open("multi_lines_writelines.txt", "r", encoding="utf-8") as f:
print(f.read(), end="")
A
B
C
改行(\n)の入れ方
テキストファイルの改行は基本的に\n
で表現します。
ファイルをテキストモードで開くと、Pythonが環境に合わせて適切な改行コードに変換します。
改行の有無を確認したい時は、repr
表示が便利です。
# 改行の有無をreprで確認する
with open("newline_sample.txt", "w", encoding="utf-8") as f:
f.write("Aの行\nBの行\n") # 各行の末尾に\nを入れる
with open("newline_sample.txt", "r", encoding="utf-8") as f:
for i, line in enumerate(f, 1):
print(i, repr(line)) # reprで\nが見える形で表示
1 'Aの行\n'
2 'Bの行\n'
上書きと追記の書き込み
上書き(w)の動き
"w"
モードで開くと、既存の内容はすべて破棄されます。
つまりファイルの先頭から書き直します。
これは初期化や生成時に便利ですが、残しておきたい内容がある場合に使うと消えてしまうので注意が必要です。
# 上書きの動作例
# 1. 初期ファイルを用意
with open("overwrite.txt", "w", encoding="utf-8") as f:
f.write("もとの1行\nもとの2行\n")
# 2. wモードで上書き
with open("overwrite.txt", "w", encoding="utf-8") as f:
f.write("上書き後の1行のみ\n")
# 3. 結果確認
with open("overwrite.txt", "r", encoding="utf-8") as f:
print(f.read(), end="")
上書き後の1行のみ
追記(a)で末尾に追加
"a"
モードはファイル末尾に追加します。
既存の内容は保持され、新しい文字列だけが最後に付け加わります。
# 追記の動作例
with open("append.txt", "w", encoding="utf-8") as f:
f.write("先頭の1行\n")
with open("append.txt", "a", encoding="utf-8") as f:
f.write("追記の1行\n")
f.write("さらに追記\n")
with open("append.txt", "r", encoding="utf-8") as f:
print(f.read(), end="")
先頭の1行
追記の1行
さらに追記
存在しない場合は新規作成
"w"
も"a"
も、指定したファイルが存在しなければ新規作成します。
追記モードでもファイルが無いからといってエラーにはなりません。
# 存在しないファイルをaモードで開くと新規作成される
with open("created_by_append.txt", "a", encoding="utf-8") as f:
f.write("最初の内容\n")
with open("created_by_append.txt", "r", encoding="utf-8") as f:
print(f.read(), end="")
最初の内容
上書きと追記の違いを簡単に整理します。
モード | 既存内容 | 書き込み位置 | ファイルが無い場合 | 主な用途 |
---|---|---|---|---|
w | 破棄 | 先頭から | 新規作成 | 初期化、生成 |
a | 保持 | 末尾のみ | 新規作成 | ログ追記、追跡記録 |
文字化け対策とエンコーディング
UTF-8を指定する(encoding)
環境によってはデフォルトの文字コードが異なり、日本語が文字化けすることがあります。
常にencoding="utf-8"
を明示すると、エディタや他のツールとも互換性が高く安心です。
# UTF-8を明示して日本語や絵文字を安全に書く
text = "寿司🍣とラーメン🍜"
with open("utf8_sample.txt", "w", encoding="utf-8") as f:
f.write(text + "\n")
with open("utf8_sample.txt", "r", encoding="utf-8") as f:
print(f.read(), end="")
寿司🍣とラーメン🍜
補足: 一部の古いツールはUTF-8のBOMの有無に影響されますが、Pythonのencoding="utf-8"
はBOMなしが基本です。
特殊な要件がない限りそのままで問題ありません。
改行コードの違い
OSごとに改行コードが異なりますが、Pythonのテキストモードでは\n
を書けば環境に応じて自動変換されます。
特定の改行コードに固定したい場合はopen
のnewline
引数を使います。
# 改行コードを制御する例: バイナリで読み出して確認
# CRLFで固定
with open("crlf_fixed.txt", "w", encoding="utf-8", newline="\r\n") as f:
f.write("A\r\nB\r\n")
# LFで固定
with open("lf_fixed.txt", "w", encoding="utf-8", newline="\n") as f:
f.write("A\nB\n")
# 実際のバイト列を確認
with open("crlf_fixed.txt", "rb") as f:
print(f.read())
with open("lf_fixed.txt", "rb") as f:
print(f.read())
b'A\r\nB\r\n'
b'A\nB\n'
ポイント: CSVを書き出す際などはnewline=""
を使うケースがあります。
用途に応じて改行の挙動を選べることを覚えておくと便利です。
print()で手軽に書き込む
print(file=…)の基本
print
は標準出力だけでなく、file=
引数にファイルオブジェクトを渡すことでファイルにも書き込めます。
自動で末尾に改行が入るため、行単位での書き込みが簡単です。
# printで簡単に行単位の書き込み
with open("print_basic.txt", "w", encoding="utf-8") as f:
print("printで書く1行目", file=f) # 自動で改行
print("printで書く2行目", file=f)
with open("print_basic.txt", "r", encoding="utf-8") as f:
print(f.read(), end="")
printで書く1行目
printで書く2行目
sep/endで区切りと改行を制御
print
にはsep
で区切り文字、end
で行末文字を指定できます。
CSV風の出力や、改行しない追記など柔軟に制御できます。
# CSV風に1行を組み立てて書き込む
rows = [
("Alice", 20, "Tokyo"),
("Bob", 35, "Osaka"),
]
with open("print_csv_like.txt", "w", encoding="utf-8") as f:
for name, age, city in rows:
print(name, age, city, sep=",", file=f) # 区切りをカンマに
with open("print_csv_like.txt", "r", encoding="utf-8") as f:
print(f.read(), end="")
Alice,20,Tokyo
Bob,35,Osaka
# endで改行を抑制して連結し、最後だけ改行する
with open("print_end_control.txt", "w", encoding="utf-8") as f:
print("A", end="", file=f) # 改行しない
print("B", end="", file=f) # 改行しない
print("C", file=f) # ここで改行が入る
with open("print_end_control.txt", "r", encoding="utf-8") as f:
print(f.read(), end="")
ABC
writeとの使い分け: フォーマット済みの行を手早く出したい時はprint
、細かく制御したい時や大量データの効率重視ならwrite
が向いています。
まとめ
本記事では、Pythonでテキストファイルに文字列を書き込む方法を、open
とwrite
の最小例から、複数行の書き込み、改行の扱い、上書きw
と追記a
の違い、そしてprint(file=...)
の活用まで体系的に解説しました。
文字化けを避けるためencoding="utf-8"
を常に指定すること、w
は内容を消して上書きすること、改行は\n
を基本として必要に応じてnewline
で制御するといった要点を押さえれば、初心者の方でも安心してファイル出力が行えます。
さらに安全に扱うwith
構文や他のモードの詳細は別記事で補いますが、本記事の内容だけでも多くの書き込みタスクを確実にこなせます。