Pythonでバイナリファイルを読み書きする方法を完全ガイド!初心者でもわかるrb / wbモードの使い方
生徒
「Pythonで画像とか音声みたいなデータを読み込んだり保存したりできますか?」
先生
「できますよ!そういったファイルは“バイナリファイル”と呼ばれていて、Pythonではrbやwbというモードで読み書きします。」
生徒
「バイナリファイルって何ですか?テキストファイルとは違うんですか?」
先生
「はい、テキストファイルは文字だけですが、バイナリファイルは画像や音、動画など、人間には読めないデータのかたまりなんです。それじゃあ詳しく説明していきましょう!」
1. バイナリファイルとは?
バイナリファイルとは、コンピューターが理解できる形で保存されたファイルのことです。画像ファイル(.jpg や .png)、音声ファイル(.mp3 や .wav)、PDF、Word、Excel などがそれにあたります。
こうしたファイルの中身は「0」や「1」のデジタル信号の集合体です。パソコンで「開いても文字化けする」ようなファイルがバイナリファイルだと思えばOKです。
2. rb / wb モードとは?
Pythonでファイルを開くときには、open()関数を使います。そのとき、どのようにファイルを操作するかを指定するのが「モード」です。
rb:バイナリファイルを「読み込み専用」で開く(read binary)wb:バイナリファイルを「書き込み専用」で開く(write binary)
"rb"や"wb"の「b」がポイントで、これを付けないとテキストファイルとして開いてしまいます。
3. バイナリファイルを読み込む基本
例えば、画像ファイルを読み込むには以下のように書きます:
with open("photo.jpg", "rb") as f:
binary_data = f.read()
with構文はファイルを開いたあとの「自動で閉じる仕組み」です。初心者でも安心して使えます。
f.read()で全体のバイナリデータを読み込み、変数binary_dataに格納しています。
4. バイナリファイルを書き込む基本
次は読み込んだバイナリデータを別のファイルに保存(書き込み)する方法です。コピーのようなイメージです。
with open("photo_copy.jpg", "wb") as f:
f.write(binary_data)
wbモードを使うと、既存のファイルは上書きされます。間違って大事なファイルに書き込まないように注意しましょう。
5. 画像ファイルをコピーする簡単な例
これまでの読み書きを組み合わせれば、画像ファイルをコピーすることができます。
with open("original.png", "rb") as source:
data = source.read()
with open("copied.png", "wb") as target:
target.write(data)
このように、バイナリファイルをrbモードで読み込み、wbモードで書き出すだけで簡単にコピーができます。
6. バイナリファイルとテキストファイルの違い
バイナリファイルは、文字コードなどを考えず「そのままのデータ」を読み書きします。一方でテキストファイル(.txtや.csvなど)は、読み込んだ後に文字列として扱うため、「文字コード(UTF-8など)」が関係してきます。
つまり、画像や音声などの人間が読めない形式にはバイナリモードを、文章など人間が読める形式にはテキストモードを使うのが基本です。
7. エラーが出たときの対処方法
バイナリファイルを扱っていると、次のようなエラーに出会うことがあります:
- FileNotFoundError: ファイルの名前が間違っている、またはファイルが存在しない。
- PermissionError: ファイルが開けない。書き込み禁止や管理者権限の問題の可能性あり。
- ValueError:
write()に文字列を渡してしまった。wbモードではバイト型(bytes)でないと書けません。
8. バイナリデータを部分的に読み書きする方法
大量のデータを一度に読み書きするのが難しい場合は、chunk(チャンク)という方法を使います。チャンクとは「小さなかたまり」のことです。
以下は、画像を1KBずつ読み込んでコピーする例です:
with open("original.jpg", "rb") as source, open("copy.jpg", "wb") as target:
while True:
chunk = source.read(1024)
if not chunk:
break
target.write(chunk)
これにより、大きなファイルでもメモリを圧迫せずに安全に扱えます。
9. バイナリで扱う場面は意外と多い!
Pythonのファイル処理では、バイナリモードを使う機会が実はとても多いです。以下のような場面が代表例です:
- 画像ファイルの読み書き
- 音声ファイルの編集
- PDFやWordファイルの操作
- Excelファイルの書き出し(
openpyxlなど) - データベースへのBLOB(バイナリ)保存
プログラミング初心者の方でも、「rb」「wb」を覚えることで、世界がグッと広がります。
まとめ
今回の内容ではPythonでバイナリファイルを読み書きするための基本的な考え方と実践的な使い方をじっくり確認しました。バイナリファイルということばは最初は少しむずかしく聞こえますが、画像ファイルや音声ファイルや動画ファイルやPDFファイルやオフィス文書など、日常的に扱っている多くのデータがじつはバイナリ形式で保存されていることを知るとぐっと身近に感じられます。Pythonではopen関数にrbモードやwbモードを指定してファイルを開くことで、そうしたバイナリデータを安全に読み込み保存することができます。テキストファイルを扱うときとのちがいをはっきり意識しながら使い分けることがとてもたいせつです。 バイナリファイルをrbモードで開くときには、人間が読める文字列としてではなく、コンピューターが扱うビットのならびとしてそのままのデータを読み込みます。そのため、文字コードを気にせず画像や音声や動画のデータをまとめて扱うことができます。一方でwbモードは、読み込んだデータを別のファイルに書き込んだり、新しくバイナリファイルを作成したりするときに使う基本のモードです。コピー処理やバックアップ処理のような場面では、rbモードとwbモードを組み合わせるだけでシンプルな仕組みを作ることができます。 また、with構文を使ってファイルを開く書き方を身につけることで、ファイルを閉じ忘れる心配をせずにスッキリしたコードを書けるようになります。Pythonでファイル処理をするときには、withを使った書き方を習慣にしておくと、あとからプログラムを読み直したときにも意図が分かりやすくなります。とくにバイナリファイルはサイズが大きいことが多いので、開いたまま放置してしまうとメモリの使用量やファイルロックの問題につながるおそれがあります。きちんと開いてきちんと閉じるという基本を守ることが安定したファイル処理につながります。 さらに、チャンクとよばれる小さなかたまりごとにデータを読み込む方法も確認しました。大きな画像ファイルや長時間の音声ファイルや高画質の動画ファイルを一度にメモリに読み込むと、パソコンの負担が大きくなりプログラムが止まってしまうことがあります。そんなときには、一定のサイズずつ分割して読み書きすることで、安定して処理を続けることができます。Pythonでのバイナリファイル処理では、このようなチャンク読み込みの考え方がとても役に立ちます。 エラーについても、ファイルが存在しないときのFileNotFoundErrorやアクセス権が足りないときのPermissionErrorや、wbモードで文字列を書き込もうとしてしまったときのValueErrorなど、よく出てくるものを整理しました。エラーメッセージをこわがるのではなく、原因をひとつずつ確認しながら落ち着いて対処できるようになると、Pythonのファイル処理全体への理解も深まります。バイナリファイルの読み込みと書き込みの考え方が分かってくると、画像処理や音声処理やPDF操作やExcel操作など、さまざまな外部ライブラリの公式ドキュメントも読みやすくなってきます。 こうした基礎をしっかり身につけることで、Pythonでできることの幅が大きく広がります。画像ファイルをコピーして自動整理したり、音声ファイルを一括でバックアップしたり、PDFやオフィス文書をまとめて変換したりといった処理も、バイナリファイルの読み書きの基本が分かっていれば落ち着いて組み立てることができます。まずは身近なフォルダにある画像ファイルや音声ファイルを対象に試してみて、rbモードとwbモードの感覚を体に覚えさせていくとよいでしょう。
バイナリファイル読み書きの流れを整理しよう
あらためてPythonでバイナリファイルを扱うときの基本的な流れを整理すると、最初にファイルをrbモードまたはwbモードでopenし、つぎにreadやwriteでデータをやり取りし、最後にファイルを閉じるという三つのステップに分けて考えることができます。with構文を使えば三つ目のステップは自動で処理されるので、開いて読み書きするという部分に集中できます。画像コピーの例で考えると、元のファイルをrbモードで開いてデータを読み込み、そのデータをwbモードで開いた別のファイルに書き込むだけで基本的なコピー処理が完成します。 また、大きなファイルを扱うときには、readにサイズを指定してチャンクごとに読み込んでいく方法がとても有効です。ループの中で少しずつ読み書きすることで、メモリの負担をおさえながら安定した処理を行うことができます。この考え方を理解しておくと、ネットワーク越しにデータを送受信するときや、ストリームとしてデータを扱うときにも応用ができます。Pythonでバイナリデータを扱う場面は、想像以上に多く存在します。
サンプルプログラムでもう一度復習しよう
ここでは、記事の内容をもとにした復習用のサンプルプログラムを載せておきます。画像ファイルをチャンク単位でコピーするシンプルな例ですが、rbモードとwbモードの役割とバイナリファイルの読み書きの流れを確認するのにちょうどよい題材になっています。自分のパソコンの環境に合わせてファイル名を変更しながら、実際にPythonで動かしてみると理解がいっそう深まります。
chunk_size = 1024 * 4
with open("original_image.png", "rb") as source, open("backup_image.png", "wb") as target:
while True:
data = source.read(chunk_size)
if not data:
break
target.write(data)
このサンプルでは、chunk_sizeで読み込み単位を指定しながら、元の画像ファイルから新しい画像ファイルへとバイナリデータを順番に書き出しています。大きな画像ファイルでも安定して処理できるので、フォルダ内の複数のファイルを対象に応用してみるのもおすすめです。Pythonでバイナリファイルを扱うときの基本形として、手元のメモなどに残しておくとよいでしょう。
生徒「きょうの内容で、バイナリファイルということばがぐっと身近になった気がします。画像ファイルや音声ファイルがぜんぶバイナリデータだと分かると、Pythonでできることがとても多いんだなあと感じました。」
先生「そうですね。Pythonでrbモードやwbモードを使いこなせるようになると、ふだん見ているファイルの裏側をそのまま扱えるようになります。コピーもバックアップも自動整理も、バイナリファイルの読み書きが分かっていれば落ち着いて組み立てられます。」
生徒「テキストファイルとのちがいも印象に残りました。文字として読むときはモードの書き方がちがうし、バイナリのときはそのままのデータを扱うんだと意識できるようになりました。」
先生「その感覚はとても大事です。これから画像処理のライブラリや音声処理のライブラリを使う機会があったときにも、きょう学んだrbモードやwbモードの考え方が役に立ちますよ。エラーメッセージに出てくることばも、意味がつながって見えてくるはずです。」
生徒「チャンクという考え方もおもしろかったです。大きなファイルをすこしずつ読み込むという発想は、プログラムならではだなあと感じました。」
先生「その通りです。Pythonでバイナリデータを扱うときには、きょうのような小さな工夫が安定したプログラムづくりにつながります。まずは手元の画像ファイルや音声ファイルを題材に、rbモードとwbモードを使ったコピー処理やバックアップ処理を自分なりに作ってみてください。」
生徒「はい。バイナリファイルだからといってこわがらずに、きょうのサンプルコードを参考にしながら少しずつ練習していこうと思います。」
先生「それがいちばんの近道です。Pythonのファイル処理に慣れてくると、プログラミング全体への自信も育っていきますから、楽しみながら続けていきましょう。」