2025年10月27日月曜日

技術メモ BlenderPythonの「Runtime Error:csvに列IDがありません」の解決

 Technical Note: Fixing BlenderPython's "Runtime Error: CSV file contains no column ID"


I'm using a BlenderPython script that plots CSV files containing data on tens of thousands of artifacts (IDs, xyz coordinates, and numerous attributes) as vertices in the Blender3D viewport within a second. However, the other day, I suddenly got the error "Runtime Error: CSV file contains no column ID," and was unable to plot. I've written a note about how to fix this.


数万遺物データを格納したcsvファイル(ID、xyz座標、多数の属性)を、Blender3Dビューポートに1秒以内に頂点としてプロットするBlenderPythonスクリプトを重宝して活用しています。ところが先日突然、「Runtime Error:csvに列IDがありません」が出て、プロットできなくなりました。その解決策をメモしました。

1 エラーの様子


遺物プロットに使っているBlender画面(2画面用にカスタマイズ、右端コンパートメントがBlenderPythonを記述したテキストエディター)

数万遺物データを格納したcsvファイル(ID、xyz座標、多数の属性)を、Blender3Dビューポートに1秒以内に頂点としてプロットできる優れモノのBlenderPythonスクリプトを毎日重宝して活用しています。ところが先日突然、「Runtime Error:csvに列IDがありません」が出て、プロットできなくなりました。csvファイルに異常は見つかりません。ID列は正常です。試しに列を入れ替えて、先頭列をxにしたところ、「Runtime Error:csvに列xがありません」が出てしまいます。

2 エラーの原因

ChatGPTに調査依頼してエラー原因を突きとめることができました。

BlenderPythonにおけるcsvファイル読込エンコードが encoding="utf-8"であるのに対して、csvファイルのエンコードが"utf-8-sig"であったので読み込めなかったのです。

自分はcsvファイルとExcelの間での文字化け回避などで"utf-8"と"shift-jis"の違いはいつも意識していたのですが、今回はじめて"utf-8-sig"というエンコードに直面して、エラー解決できなかったのです。"utf-8-sig"というエンコードのcsvファイルができたのは、2つのcsvフィアルを操作して1つの新しいcsvファイルを作成するPythonスクリプトをChatGPT支援で作った際に混入したことも判りました。

エラーとなったcsvをWZエディターで開き、文字コードを見ると、確かにUTF-8(BOM付き)になっています。


エラーとなったcsvファイルの文字コード

エンコード"utf-8-sig"のcsvファイルでは最初列名文字先頭に「BOM(Byte Order Mark)」という目に見えない文字(`\ufeff`)が入り、列名が\ufeffIDになり、スクリプトで指定した列名IDと異なり、エラーとなりました。

3 解決策

BlenderPythonスクリプトのcsvファイル読み込み部で、encoding="utf-8"をencoding="utf-8-sig"に修正して対処しました。これで"utf-8"のcsvファイルも"utf-8-sig"のcsvファイルも正常に読み込むことができます。

また原因がわかりましたので、同じエラーが類似BlenderPythonスクリプトで出た時は上記のように修正するか、csvファイルをWZエディターで読込み、"utf-8"に変更して書き出して使うことにします。


0 件のコメント:

コメントを投稿