EmacsのOrg-modeにおいてPythonコードブロックを使った時の落とし穴

ソース: Org-mode logo

EmacsのOrg-modeが非常に便利なツールで,コンパイラー環境が揃っているならコードブロックを使って直接にコンパイルできることが魅力的。ただPythonを使う際に落とし穴がある,一緒に見てみよう!

目次

Pythonソースコードエンコーディングの定義が効かない

例えば,以下のテーブル(テーブルネームが test )があるとする。

日付金額残高詳細備考参照
<2019-11-01 金>50005000収入何らかの収入
<2019-11-05 火>-10004000買い物スーパー

そこで,コードブロックにおいて,以上のテーブルの内容を読み込むときに, 以下のようにコードブロックのヘッダーを定義する。

#+begin_src python :var data=test
  ... # コード

このままで実行する(C-c C-c)と,以下のようなエラーが出てくる。1

File "<stdin>", line 3
SyntaxError: Non-UTF-8 code starting with '\xe3' in file <stdin> on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

テーブルに日本語が入っているため,このエラーが予想内。 なので,以下のようにコードブロックを修正する。

#+begin_src python :var data=test
  # -*- coding: utf-8 -*-
  ... # コード

もう一度実行すると,同じエラーが出てくる。 # -*- coding: utf-8 -*- が効かなかったのでは?と思ったら,

まず以下のようにヘッダーを修正し, 「日付」・「金額」・「残高」三つの列(データに半角英数字・符号しかない列)だけを 読み込ませるようにしておく。

#+begin_src python :var data=test[, 0:2]
  ... # コード

当然ながら,今回はエラーなくコンパイルできた。これは納得できる。

調べてみた結果, # -*- coding: utf-8 -*- を効かせるためには, 直接に書くではなく,コードブロックヘッダーにpreamble引数を渡す。2

以下のように修正する。

#+begin_src python :preamble "# -*- coding: utf-8 -*-" :var data=test
  ... # コード

今回は無事にコンパイルできた。

その他の落とし穴

「見つけ次第ここに追記」

このページを編集

Xin Li
Xin Li
講師

機械学習及び深層学習の応用に関する研究に従事し,不均一・偏りのあるデータに対するサンプリング手法および学習アルゴリズムに注目している。詳細はこちら

comments powered by Disqus
次へ
前へ

関連項目