Raspberry Piのセンサーデータ保存・CSV出力の基本|Excelで文字化けしない書き方【2026年版】

プログラミング・電子工作






Raspberry Piのセンサーデータ保存・CSV出力の基本|Excelで文字化けしない書き方【2026年版】|YOFUKASI AI




Raspberry Pi / Python

Raspberry Piのセンサーデータ保存・CSV出力の基本――Excelで文字化けしない書き方まで。

せっかく記録したデータ、Excelで開いたら記号だらけになっていませんか。csvモジュールの基本から、Excel特有の文字化け対策、上書き・空白行トラブルの回避まで、他の記事より一歩踏み込んで解説します。

YOFUKASI AI編集部 | 更新日:2026年8月18日 | 読了目安:約14分

Chapter 01 — Introduction

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での文字化け問題とその対処法、そして実際にセンサー値を定期的に記録するプログラムの作り方までを、初心者にもわかりやすく、かつ実務で役立つレベルまで踏み込んで解説する。



Chapter 02 — Background

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してから利用すると説明されている

Chapter 03 — Mechanism

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で可視化する手順が紹介されている。



Chapter 04 — Comparison

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)を検討するとよい。

Chapter 05 — Practice

05実践:センサー値を定期的にCSV保存するプログラムを作る5ステップ

ここでは「温湿度センサーの値を60秒おきに、日時つきでCSVに追記していくプログラム」を作る手順を示す。

  1. STEP1. 必要なモジュールをインポートする

    csv・time・datetimeの3つをインポートする。

    例:import csv; import time; from datetime import datetimeを記述した。
  2. STEP2. CSVファイルを開くときの引数を正しく指定する

    追記モード(‘a’)・改行の指定(newline=”)・文字コード(encoding=”utf-8-sig”)の3点を必ずセットで指定する。

    例:with open("sensor_log.csv", "a", newline="", encoding="utf-8-sig") as f:という形で開いた。
  3. STEP3. 現在時刻とセンサー値をリストにまとめる

    datetime.now()で現在時刻を取得し、文字列に変換してから、センサー値と一緒にリストにする。

    例:now = datetime.now().strftime("%Y-%m-%d %H:%M:%S"); row = [now, temperature, humidity]を記述した。
  4. STEP4. writerow()でCSVに1行追記する

    writer.writerow(row)を呼び出し、作成したリストを1行として書き込む。

    例:writer = csv.writer(f); writer.writerow(row)を記述した。
  5. STEP5. ループとsleep()で60秒おきに繰り返す

    STEP2〜4の処理をwhileループの中に入れ、time.sleep(60)で60秒待ってから次の記録に移る。

    例:はじめはopen()の第2引数を”w”のままにしていたため、プログラムを再起動するたびに過去のデータが消えてしまっていた。”a”(追記モード)に変更したところ、過去のデータを残したまま記録を継続できるようになった(編集部想定シナリオ)。

このプログラムを土台に、複数のセンサーを1行にまとめて記録したり、一定の閾値を超えたときだけ記録する、といった発展的な仕組みへも拡張しやすい。

Chapter 06 — Pitfalls

06注意点・よくある誤解

!誤解1. CSVはただの文字の羅列だから、文字コードなど気にしなくてよい

CSVファイルは見た目こそシンプルなテキストだが、内部の文字コードが保存時と読み込み時でずれていると、日本語部分が文字化けする。特にExcelで開く前提のCSVは、encoding=”utf-8-sig”を指定して保存しておくと安心である。

!誤解2. open()の第2引数は”w”にしておけば間違いない

“w”(書き込みモード)は、ファイルを開くたびに中身を空にしてしまう。継続的にセンサー値を記録し、過去のデータも残しておきたい場合は”a”(追記モード)を使う必要がある。”w”のまま繰り返し実行すると、それまで記録したデータが消えてしまう。

!誤解3. newline=”は付けても付けなくても同じだ

newline=”を指定せずにcsvモジュールでファイルを開くと、Windows環境では改行コードの扱いの違いにより、1行おきに空白行が入ってしまうことがある。csvモジュールを使う際は、newline=”を必ずセットで指定する習慣をつけておきたい。



Chapter 07 — FAQ

07FAQ

Q.Raspberry Piでセンサーの値をCSVに保存する一番シンプルな方法は何ですか。
A.Pythonの標準ライブラリであるcsvモジュールを使う方法が最もシンプルです。import csvと書いたあと、ファイルをopen()で開き、csv.writer()でwriterオブジェクトを作成し、writerow()に値のリストを渡すだけで1行分のデータをCSVファイルに書き込めます。追加のライブラリをインストールする必要がなく、Raspberry Pi OSに標準で含まれています。

Q.保存したCSVファイルをExcelで開いたら日本語が文字化けしました。なぜですか。
A.CSVファイル自体には文字コードの情報が含まれていないため、Excelは開くときに自動的に「Shift_JIS(CP932)」だろうと判断して読み込もうとします。一方Pythonのcsvモジュールで保存すると、通常はUTF-8という別の文字コードで保存されるため、この認識のズレによって日本語部分が文字化けしてしまいます。

Q.Excelでの文字化けを防ぐにはどうすればよいですか。
A.ファイルを開く際にencoding=”utf-8-sig”を指定するのが最も簡単で確実な方法です。これはBOM(Byte Order Mark)と呼ばれる目印付きのUTF-8で保存する指定で、この目印があることでExcelがUTF-8だと正しく認識できるようになり、多くの場合文字化けが解消されます。

Q.書き込むたびに前のデータが消えてしまいます。どうすればよいですか。
A.open()の第2引数に’w'(書き込みモード)を指定していると、ファイルを開くたびに中身が空になり上書きされてしまいます。過去のデータを残したまま追記していきたい場合は、’a'(追記モード)を指定してください。プログラムを繰り返し実行しても、既存の内容の末尾に新しい行が追加されるようになります。

Q.Windows環境でCSVを開くと1行おきに空白行が入るのはなぜですか。
A.ファイルをopen()で開く際にnewline=”(空文字)を指定していないと、Windows環境では改行コードの扱いの違いにより、1行おきに空白行が入ってしまうことがあります。csvモジュールを使う場合は、open()の引数にnewline=”を必ず指定することが推奨されています。

Q.長時間センサーの値を記録し続ける場合、何に注意すればよいですか。
A.記録する間隔(たとえば60秒おきなのか1秒おきなのか)によって、CSVファイルのサイズは大きく変わります。長期間・高頻度で記録し続けると、SDカードの容量を圧迫したり、ファイルが巨大になって開きにくくなったりすることがあります。日付ごとにファイルを分ける、記録間隔を用途に合わせて調整するといった工夫が必要になります(編集部見解)。

参考文献

関連記事(内部リンク)

該当なし(本記事はRaspberry Pi・Python(CSV出力)がテーマであり、内部リンクプールはArduino関連記事のみで構成されているため、無理な挿入は行っていません。)


関連記事

特集記事

コメント

この記事へのコメントはありません。

TOP
CLOSE