Raspberry Piのセンサーデータ保存・CSV出力の基本――Excelで文字化けしない書き方まで。
せっかく記録したデータ、Excelで開いたら記号だらけになっていませんか。csvモジュールの基本から、Excel特有の文字化け対策、上書き・空白行トラブルの回避まで、他の記事より一歩踏み込んで解説します。
目次
01CSV保存は「書けた」で終わりではない
結論から言えば、Raspberry Piでセンサーの値をCSVに保存すること自体は、Pythonの標準ライブラリだけで簡単にできる。しかし、「保存できた」と「あとで問題なく使える」の間には、実はいくつかの落とし穴がある。特に日本語話者にとって深刻なのが、保存したCSVをExcelで開くと日本語部分が文字化けしてしまう問題である。
実例として、温湿度センサーBME280をRaspberry PiにI2C接続し、値をCSVに出力して長期間記録したプロジェクトがある。【Raspberry Pi】温湿度センサーで取得した値をcsvで出力する方法(BME280)(メタエレ実験室)では、エクセルでグラフ化する際に時間のデータも欲しいためdatetimeモジュールをインポートして現在の時刻を取得し、60秒おきにcsvに出力する設定で約12時間分のデータを取得したことが報告されている。このように、センサー値だけでなく「いつ測定したか」を記録しておくことが、あとで分析する際に重要になる。
編集部見解:CSV保存のチュートリアルは数多く存在するが、多くは「csv.writerで書き込めます」で終わってしまい、実際にExcelで開いたときのトラブルまでカバーしていないことが多い。この記事では、そこから一歩踏み込んで、実務で本当につまずくポイントまで解説する。
― YOFUKASI AI編集部
本記事では、csvモジュールの基礎知識から、Excelでの文字化け問題とその対処法、そして実際にセンサー値を定期的に記録するプログラムの作り方までを、初心者にもわかりやすく、かつ実務で役立つレベルまで踏み込んで解説する。
02csvモジュールの基礎知識
PythonでCSVファイルを扱うには、標準ライブラリのcsvモジュールを使う。追加のインストールは不要で、import csvと書くだけですぐに使える。基本の書き方は次のようになる。
import csv
with open("sensor_data.csv", "a", newline="", encoding="utf-8-sig") as f:
writer = csv.writer(f)
writer.writerow(["2026-08-18 09:00:00", 25.3, 60.1])
Python公式ドキュメントでも、この使い方が説明されている。csv — CSVファイルの読み書き(Python公式ドキュメント)では、csvモジュールのreaderおよびwriterオブジェクトはシーケンス型を読み書きし、プログラマはDictReaderやDictWriterクラスを使うことでデータを辞書形式で読み書きすることもできると説明されている。
用語の整理
- writer:リスト形式のデータを1行ずつCSVに書き込むためのオブジェクト。
- DictWriter:辞書形式のデータを、指定した列の順序でCSVに書き込むためのオブジェクト。列の見出し(ヘッダー)を扱いやすい。
- newline=”:open()の引数。これを指定しないと、Windows環境で開いた際に1行おきに空白行が入ることがある。
Raspberry PiでCSV・JSON形式のデータを保存する基本的な考え方についても、参考になる記事がある。60: Raspberry Pi 3 でデータを保存する(Qiita)では、CSVならExcelなどで読み込んで処理しやすいためCSVとJSONの両方を扱う方法が紹介されており、CSVを作る場合はimport csvしてから利用すると説明されている。
03なぜExcelで文字化けするのか、仕組みと対処法
この章が、他の多くの入門記事にはない本記事最大のポイントである。CSVファイル自体には、実は「これは何という文字コードで書かれているか」という情報が含まれていない。そのため、開くソフト側が推測して読み込む必要がある。
この仕組みについて、わかりやすく解説した記事がある。Excelで日本語CSVが文字化けする原因と正しい開き方(Bureau Mikami)では、CSVファイルは文字コード情報を内部に持たないシンプルなテキストファイルであり、ExcelはCSVファイルを開くとき自動的に「Shift_JIS(CP932)」だと判断して読み込もうとするため、UTF-8で保存されたファイルではこのギャップにより日本語が文字化けすると説明されている。Pythonのcsvモジュールで何も指定せずに保存すると、多くの場合UTF-8で書き出されるため、このズレが起こりやすい。
解決策:utf-8-sig(BOM付きUTF-8)を使う
この問題を解決する最も手軽な方法が、ファイルを開く際にencoding="utf-8-sig"を指定することである。【Python】pandasのto_csvで文字化け!Excelで開けるCSV保存法(morinokabu)では、最も強力で推奨される解決策がエンコーディングにutf-8_sigを指定することであり、これはBOM付きのUTF-8を意味し、この「BOM」という目印をファイルの先頭に付けることでExcelがUTF-8のファイルだと正しく認識できるようになり、ほとんどの文字化けはこれで解決すると説明されている。
「utf-8-sig」は、ファイルの一番先頭に「これはUTF-8ですよ」という目印(BOM)をこっそり付けてくれる保存方法だとイメージすると分かりやすい。この目印のおかげで、Excelが最初から正しい文字コードで読み込んでくれるようになる。難しい変換ツールを使わなくても、Pythonのopen()の引数を1つ変えるだけで解決できるのが大きなメリットである。
センサーの種類によらず、この文字コードの考え方は共通する。加速度センサーの値をCSVに保存して可視化した実例もある。【Raspberry Pi】加速度センサーの値をCSVファイルに出力して可視化(MPU6050)(メタエレ実験室)では、MPU6050という加速度センサーの値をCSVファイルに出力し、Excelで可視化する手順が紹介されている。
04csv.writer・DictWriter・pandasの比較
センサー値をCSVに保存する方法にも、いくつかの選択肢がある。以下に整理する。
| 項目 | A. csv.writer | B. csv.DictWriter | C. pandas(to_csv) |
|---|---|---|---|
| データの形式 | リスト(順序で管理) | 辞書(列名で管理) | DataFrame(表形式) |
| 列の見出し管理 | 自分で書く必要がある | writeheader()で自動生成 | 自動で列名を使用 |
| 追加ライブラリ | 不要(標準ライブラリ) | 不要(標準ライブラリ) | pandasのインストールが必要 |
| 向いている場面 | シンプルな定期記録 | 列が多い・順序を明示したい場合 | 後でデータ分析・グラフ化も行う場合 |
※DictWriterの詳細な使い方はPython公式ドキュメント「csv」を参照。列名をキーとした辞書をwriterow()に渡すことで、順序を気にせず書き込める。
Raspberry Piでのセンサーロギングのように、決まった列を毎回同じ順序で記録するだけであれば、A案(csv.writer)で十分なことが多い。列が多く見出し管理を楽にしたい場合はB案、記録後にすぐ分析・グラフ化まで行いたい場合はC案(pandas)を検討するとよい。
05実践:センサー値を定期的にCSV保存するプログラムを作る5ステップ
ここでは「温湿度センサーの値を60秒おきに、日時つきでCSVに追記していくプログラム」を作る手順を示す。
-
STEP1. 必要なモジュールをインポートする
csv・time・datetimeの3つをインポートする。
例:import csv; import time; from datetime import datetimeを記述した。 -
STEP2. CSVファイルを開くときの引数を正しく指定する
追記モード(‘a’)・改行の指定(newline=”)・文字コード(encoding=”utf-8-sig”)の3点を必ずセットで指定する。
例:with open("sensor_log.csv", "a", newline="", encoding="utf-8-sig") as f:という形で開いた。 -
STEP3. 現在時刻とセンサー値をリストにまとめる
datetime.now()で現在時刻を取得し、文字列に変換してから、センサー値と一緒にリストにする。
例:now = datetime.now().strftime("%Y-%m-%d %H:%M:%S"); row = [now, temperature, humidity]を記述した。 -
STEP4. writerow()でCSVに1行追記する
writer.writerow(row)を呼び出し、作成したリストを1行として書き込む。例:writer = csv.writer(f); writer.writerow(row)を記述した。 -
STEP5. ループとsleep()で60秒おきに繰り返す
STEP2〜4の処理をwhileループの中に入れ、
time.sleep(60)で60秒待ってから次の記録に移る。例:はじめはopen()の第2引数を”w”のままにしていたため、プログラムを再起動するたびに過去のデータが消えてしまっていた。”a”(追記モード)に変更したところ、過去のデータを残したまま記録を継続できるようになった(編集部想定シナリオ)。
このプログラムを土台に、複数のセンサーを1行にまとめて記録したり、一定の閾値を超えたときだけ記録する、といった発展的な仕組みへも拡張しやすい。
06注意点・よくある誤解
CSVファイルは見た目こそシンプルなテキストだが、内部の文字コードが保存時と読み込み時でずれていると、日本語部分が文字化けする。特にExcelで開く前提のCSVは、encoding=”utf-8-sig”を指定して保存しておくと安心である。
“w”(書き込みモード)は、ファイルを開くたびに中身を空にしてしまう。継続的にセンサー値を記録し、過去のデータも残しておきたい場合は”a”(追記モード)を使う必要がある。”w”のまま繰り返し実行すると、それまで記録したデータが消えてしまう。
newline=”を指定せずにcsvモジュールでファイルを開くと、Windows環境では改行コードの扱いの違いにより、1行おきに空白行が入ってしまうことがある。csvモジュールを使う際は、newline=”を必ずセットで指定する習慣をつけておきたい。
07FAQ
参考文献
- Python Software Foundation「csv — CSVファイルの読み書き」Python公式ドキュメント. https://docs.python.org/ja/3/library/csv.html
- メタエレ実験室「【Raspberry Pi】温湿度センサーで取得した値をcsvで出力する方法(BME280)」メタエレ実験室, 2020年. https://hellobreak.net/raspberry-pi-csv-bme280/
- メタエレ実験室「【Raspberry Pi】加速度センサーの値をCSVファイルに出力して可視化(MPU6050)」メタエレ実験室, 2020年. https://hellobreak.net/raspberry-pi-mpu6050-csv/
- morinokabu「【Python】pandasのto_csvで文字化け!Excelで開けるCSV保存法」note, 2025年. https://note.com/morinokabu/n/nbe890c750274
- Bureau Mikami「Excelで日本語CSVが文字化けする原因と正しい開き方【UTF-8】」Bureau Mikami, 2025年. https://www.bureau-mikami.jp/excel-csv-encoding/
- K2_「60: Raspberry Pi 3 でデータを保存する」Qiita, 2018年. https://qiita.com/K2_/items/0d8a92cbd0500bb517bf
- 本文中の具体的な原因特定エピソードは、断りのない限り編集部想定シナリオに基づく想定であり、実測データではありません。
関連記事(内部リンク)
該当なし(本記事はRaspberry Pi・Python(CSV出力)がテーマであり、内部リンクプールはArduino関連記事のみで構成されているため、無理な挿入は行っていません。)
コメント