当表中包含的元素是从org-to-python-to-pandas,然后返回org时,我有点头疼。 utf-8编码。从org-mode向python传递utf-8表格
在下面的例子中,它是暴露给python的tbl var。我相信这是默认的Python元素的字符串类型,而不是unicode。
这些然后导入到熊猫数据框(尽管这只是一个实现细节,我怀疑)为str类型。
#+NAME: TBL...
#+BEGIN_SRC python :preamble "# -*- coding: utf-8 -*-" :results raw :var tbl=TBL :colnames no
import orgtools as ot
df = ot.org2df(tbl)
return ot.df2org(df)
#+END_SRC
因为大熊猫认为它越来越ASCII字符串作为元素,而不是UTF-8的元素,我发现自己不得不遍历每个元素,被设置为UTF-8,但随后编码回ASCII,以不破熊猫已经做出了类型假设。这是有效的,但显然我放弃了非ASCII字符,它很丑陋。见下文。
我的问题是 - 是否有一种方法将var tbl = TBL传递给python,以便每个表元素中包含的数据正确编码为python unicode UTF-8而非ASCII字符串?
我相信如果是这种情况,那么当试图使用tabluate库转换回组织表时,它会避免进一步下错的错误。表格库抛出时没有使用我的重新编码为ASCII,但我不认为这是一个问题与制表,但与输入提供的:var被键入为字符串,但实际上包含utf-8。
import pandas as pd
from tabulate import tabulate
from unicodedata import normalize
# Required to use Tabulate library on Org Tables with Unicode characters
def removeUnicode(item):
if isinstance(item, basestring):
return normalize('NFKD', item.decode('utf_8')).encode('ascii','ignore')
else: return item
# Convert an Org table, stored in a var in a python src block to a Pandas Dataframe
def org2df(orgTblVar):
return pd.DataFrame(orgTblVar[1:],columns=orgTblVar[0]).applymap(removeUnicode)
# Convert a Pandas DataFrame to an Org table
def df2org(df):
return tabulate(df, list(df), showindex=False, floatfmt=".8f", tablefmt="orgtbl")
我正在使用Python 2.7和emacs24。
谢谢!
UPDATE
这不是一个完整的答案,但已经与制表业主的人讨论这个问题,我已经表明,它可以通过以下的数据帧的UTF-8解码保存的Unicode,用UTF-8编码来自Tabulate的实际输出。问题与Tabulate无关!
这是比我原来的解决方案,删除unicode,因为这是正确保留字符。
我仍然认为如果您可以在Org-Babel的输入和输出中指定字符编码,但它除非其他人发表评论,我认为这不可能。
看到这里从组织/ Python的讨论和调试会话,展示了内部:
Discussion of issue on BitBucket
前导码应该注意::preamble“# - * - coding:utf-8 - * - ” – Phil
另外 - 我认为这只控制实际python脚本本身的编码,而不是内容从emacs传入的var变量? – Phil
对不起,你是对的。你的问题让我想起了我偶然发现的一些东西,但是我有硬编码的字符串。 –