Pythonでファイルを自由自在に!基本の読み書きから応用まで徹底解説
PythonをコマンドプロンプトやPowerShellでPC上で動かすには、Pythonをダウンロードしてインストールする必要があります。
まだの方はPythonのインストールと開発環境の構築の記事を参考にして、Pythonをインストールしてください。
プログラミングをしていると、「プログラムの結果をファイルに保存したい」「外部のテキストファイルからデータを読み込みたい」といった場面が必ず訪れます。Pythonを使えば、そんなファイル操作も驚くほど簡単に行えます。この記事では、Webクリエーターの皆さんがつまずきがちなファイルの読み書き(入出力)について、基本の「き」から応用例まで、コピペで動かせるコードと共に徹底的に解説します!
この記事を読み終える頃には、あなたは自信を持ってPythonでファイルを扱えるようになっているはずです。さあ、「動く」を体験しにいきましょう!🚀
ファイル操作の第一歩:`open()`関数と`with`文
Pythonでファイルを扱うには、まずopen()という組み込み関数を使って対象のファイルを開くことから始めます。そして、ファイル操作で絶対に覚えておきたいのがwith文です。with文を使ってファイルを開くと、処理が終わった後に自動でファイルを閉じてくれるので、閉じ忘れを防ぐことができます。これはPythonの「お作法」のようなものなので、必ずセットで覚えましょう。
open()関数は、主に2つの情報を必要とします。
- ファイルパス: どのファイルを扱うか(例: 'my_data.txt')
- モード: ファイルをどのように開くか(例: 'r' なら読み込み)
最も基本的なモードは以下の3つです。
'r': 読み込み (read) モード。ファイルが存在しないとエラーになります。'w': 書き込み (write) モード。ファイルが存在しない場合は新規作成され、存在する場合は中身がすべて上書きされます。'a': 追記 (append) モード。ファイルが存在しない場合は新規作成され、存在する場合は末尾に内容が追加されます。
また、日本語のようなマルチバイト文字を扱う場合は、文字化けを防ぐためにencoding='utf-8'を指定するのが一般的です。それでは、実際に見ていきましょう!
ファイルの読み込み:データをPythonに取り込む
まずは、テキストファイルの内容を読み込む方法です。事前に、次のような内容のsample.txtというファイルが、Pythonスクリプトと同じ階層にあると仮定して進めます。
Hello, Python!
これはサンプルのテキストファイルです。
ファイル操作を学びましょう。
read(): ファイル全体を一度に読み込む
read()メソッドを使うと、ファイルの中身をすべて取得し、一つの大きな文字列として返してくれます。小さなファイルに最適です。
<!-- Python Code -->
try:
with open('sample.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
except FileNotFoundError:
print('エラー: sample.txt が見つかりません。')
<!-- Expected Output -->
# Hello, Python!
# これはサンプルのテキストファイルです。
# ファイル操作を学びましょう。
readlines(): 1行ずつをリストとして読み込む
readlines()メソッドは、各行を1つの要素とするリストを返します。各行の末尾には改行文字(\n)が含まれる点に注意してください。
<!-- Python Code -->
try:
with open('sample.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
print(lines)
except FileNotFoundError:
print('エラー: sample.txt が見つかりません。')
<!-- Expected Output -->
# ['Hello, Python!\n', 'これはサンプルのテキストファイルです。\n', 'ファイル操作を学びましょう。\n']
forループ: 巨大なファイルを効率的に読み込む
ファイルが非常に大きい場合、read()やreadlines()で一度に全てをメモリに読み込むのは非効率的です。そんな時は、forループを使ってファイルを1行ずつ処理するのがベストプラクティスです。これが最もメモリ効率の良い方法です。
<!-- Python Code -->
try:
with open('sample.txt', 'r', encoding='utf-8') as f:
for line in f:
# print()は自動で改行するため、元の改行文字を削除
print(line.strip())
except FileNotFoundError:
print('エラー: sample.txt が見つかりません。')
<!-- Expected Output -->
# Hello, Python!
# これはサンプルのテキストファイルです。
# ファイル操作を学びましょう。
ファイルの書き込み:Pythonからデータを保存する
次に、Pythonで生成したデータをファイルに書き出す方法を見ていきましょう。'w'モード(上書き)と'a'モード(追記)の違いに注目してください。
write(): 新しいファイルに書き込む (上書きモード)
'w'モードでファイルを開くと、ファイルがなければ新規作成され、もし既に存在していれば中身は空っぽにリセットされます。write()メソッドで文字列を書き込みます。
注意:write()は自動で改行してくれません。改行したい場合は、自分で改行文字\nを文字列の末尾に加える必要があります。
<!-- Python Code -->
# 書き込みたい内容のリスト
lines_to_write = [
'これは新しいファイルです。\n',
'write()メソッドで書き込んでいます。\n',
'改行は \\n が必要です。\n'
]
with open('output.txt', 'w', encoding='utf-8') as f:
for line in lines_to_write:
f.write(line)
print('output.txt に書き込みが完了しました。')
# このコードを実行後、'output.txt'というファイルが作成され、
# 中身は以下のようになります。
#
# これは新しいファイルです。
# write()メソッドで書き込んでいます。
# 改行は \n が必要です。
write(): 既存のファイルに追記する (追記モード)
'a'モードを使うと、既存のファイルの内容を消さずに、末尾に新しいデータを追加できます。ログファイルなど、データを積み重ねていきたい場合に便利です。
<!-- Python Code -->
# 先ほど作成した 'output.txt' に追記します
with open('output.txt', 'a', encoding='utf-8') as f:
f.write('これは追記した行です。\n')
print('output.txt に追記が完了しました。')
# このコードを実行後、'output.txt'の中身は以下のようになります。
#
# これは新しいファイルです。
# write()メソッドで書き込んでいます。
# 改行は \n が必要です。
# これは追記した行です。
応用例:PythonでHTMLファイルを生成する
これまでの知識を応用して、Webクリエーターの皆さんにとって身近な例を見てみましょう。Pythonスクリプトで動的にHTMLファイルを生成するサンプルです。リストのデータを元に、簡単なプロフィールカードのHTMLを作成してみます。
以下のPythonコードを実行すると、profile.htmlというファイルが生成されます。これが「まるっと動く完全HTMLの例」です。
ステップ1: HTMLを生成するPythonコード
このコードをgenerate_html.pyなどの名前で保存して実行してください。
<!-- Python Code: generate_html.py -->
# プロフィールデータ
profile_data = {
'name': '山田 太郎',
'job': 'Webデベロッパー',
'skills': ['HTML', 'CSS', 'JavaScript', 'Python'],
'message': 'Pythonを使えば、こんな風に動的にHTMLを生成することも可能です!'
}
# スキルリストのHTMLを生成
skill_list_html = ''
for skill in profile_data['skills']:
skill_list_html += f' <li>{skill}</li>\n'
# HTML全体のテンプレート
html_template = f"""
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>生成されたプロフィール</title>
<style>
body {{
font-family: sans-serif;
background-color: #121212;
color: #e0e0e0;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
}}
.card {{
background-color: #1e1e1e;
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
padding: 2rem;
width: 350px;
border: 1px solid #5f6368;
}}
h1 {{
color: #669df6;
text-align: center;
}}
h2 {{
color: #8ab4f8;
border-bottom: 1px solid #5f6368;
padding-bottom: 0.5rem;
}}
ul {{
list-style: none;
padding: 0;
}}
li {{
background-color: #333;
border-radius: 5px;
padding: 0.5rem 1rem;
margin-bottom: 0.5rem;
}}
p {{
line-height: 1.6;
}}
</style>
</head>
<body>
<div class="card">
<h1>{profile_data['name']}</h1>
<p>{profile_data['job']}</p>
<h2>スキル</h2>
<ul>
{skill_list_html}
</ul>
<h2>メッセージ</h2>
<p>{profile_data['message']}</p>
</div>
</body>
</html>
"""
# ファイルに書き込む
file_path = 'profile.html'
with open(file_path, 'w', encoding='utf-8') as f:
f.write(html_template)
print(f"'{file_path}' を生成しました。ブラウザで開いて確認してください。")
ステップ2: 生成されたHTMLファイル (`profile.html`)
上記のPythonコードを実行すると、以下の内容を持つprofile.htmlファイルが作成されます。このファイルをWebブラウザで開いてみてください。ダークモードに対応したきれいなプロフィールカードが表示されるはずです。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>生成されたプロフィール</title>
<style>
body {
font-family: sans-serif;
background-color: #121212;
color: #e0e0e0;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
}
.card {
background-color: #1e1e1e;
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
padding: 2rem;
width: 350px;
border: 1px solid #5f6368;
}
h1 {
color: #669df6;
text-align: center;
}
h2 {
color: #8ab4f8;
border-bottom: 1px solid #5f6368;
padding-bottom: 0.5rem;
}
ul {
list-style: none;
padding: 0;
}
li {
background-color: #333;
border-radius: 5px;
padding: 0.5rem 1rem;
margin-bottom: 0.5rem;
}
p {
line-height: 1.6;
}
</style>
</head>
<body>
<div class="card">
<h1>山田 太郎</h1>
<p>Webデベロッパー</p>
<h2>スキル</h2>
<ul>
<li>HTML</li>
<li>CSS</li>
<li>JavaScript</li>
<li>Python</li>
</ul>
<h2>メッセージ</h2>
<p>Pythonを使えば、こんな風に動的にHTMLを生成することも可能です!</p>
</div>
</body>
</html>
気をつけるべき点とベストプラクティス
ファイル操作は強力ですが、いくつか注意点があります。
'w'モードの危険性: 書き込みモード('w')は、ファイルが既に存在する場合、警告なしに中身をすべて消去します。大切なデータを誤って消してしまわないよう、十分に注意してください。バックアップを取るか、書き込み先のファイル名を慎重に確認しましょう。- 文字コードの指定: 日本語を含むテキストを扱う際は、
encoding='utf-8'を常に指定する癖をつけましょう。これを忘れると、Windowsではcp932、macOSやLinuxではutf-8など、環境によって異なるデフォルトのエンコーディングが使われ、文字化けやエラーの原因になります。 - ファイルパスの指定: この記事では
'sample.txt'のようにファイル名だけを指定しました。これは「相対パス」と呼ばれ、実行するPythonスクリプトと同じディレクトリにあるファイルを指します。'C:\Users\YourUser\Documents\file.txt'のような絶対パスで指定することもできますが、OSによってパスの区切り文字が異なる(Windowsは\、macOS/Linuxは/)ため、pathlibモジュールを使うとより堅牢なコードになります。 - ファイルが存在しないエラー: 読み込みモード(
'r')で存在しないファイルを開こうとすると、FileNotFoundErrorというエラーが発生します。プログラムがクラッシュするのを防ぐためには、try...exceptブロックでエラーを適切に処理することが重要です。
まとめと次のステップへ
今回は、Pythonでのファイル操作の基本となる読み書きの方法を学びました。with open()構文をマスターすれば、データの永続化や外部データとの連携がぐっと楽になります。
- ファイルを開く基本は
with open('ファイル名', 'モード', encoding='utf-8') as f: - 読み込みには
read(),readlines(),forループを使い分ける。 - 書き込みには
write()を使い、'w'(上書き)と'a'(追記)を区別する。 - 日本語を扱うなら
encoding='utf-8'は必須!
ファイル操作に慣れてきたら、次に学ぶべきはエラー処理です。ファイルが見つからなかった場合にどう対処するかなど、より安定したプログラムを作るための必須知識です。ぜひ、次の記事で学んでみてください。