2017-05-16 37 views
0

当表中包含的元素是从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

回答

0

你说出UTF-8作为在Python代码的编码? python 2默认使用ascii。也许加入

# -*- coding: utf-8 -*- 

作为您的第一行将解决您的问题。

+0

前导码应该注意::preamble“# - * - coding:utf-8 - * - ” – Phil

+0

另外 - 我认为这只控制实际python脚本本身的编码,而不是内容从emacs传入的var变量? – Phil

+0

对不起,你是对的。你的问题让我想起了我偶然发现的一些东西,但是我有硬编码的字符串。 –