繁体   English   中英

从组织模式将utf-8表传递给python

[英]Passing utf-8 table to python from org-mode

当表中包含以utf-8编码的元素时,尝试从org-to-python-to-pandas提取表然后再返回org时,我有些头疼。

在下面的示例中,暴露给python的是tbl var。 我相信这是默认的字符串类型的Python元素,而不是unicode。

然后将它们作为str类型导入到pandas数据框中(尽管我只是怀疑这只是一个实现细节)。

#+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  

因为pandas认为它是以ASCII字符串作为元素,而不是UTF-8元素,所以我发现自己不得不迭代每个元素,将其设置为UTF-8,然后再编码回ASCII,以免破坏pandas已经做出的类型假设。 这行得通,但是显然我松开了非ASCII字符,这很丑陋。 见下文。

我的问题是-是否有一种方法可以将:var tbl = TBL传递给python,从而将每个表元素中包含的数据正确编码为python Unicode UTF-8而不是ASCII字符串?

我相信如果是这种情况,那么当尝试使用制表库转换回组织表时,它将避免进一步的错误。 列表库抛出时没有使用我的重新编码为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

这不是一个完整的答案,但是已经与Tabulate所有者之一进行了讨论,我已经表明可以通过遵循数据帧上的UTF-8解码并在Tabulate的实际输出上使用UTF-8编码来保留Unicode。 问题也与制表无关!

这比我原来删除unicode的解决方案要好,因为它可以正确保留字符。

我仍然认为,如果可以在Org-Babel中同时在输入和输出上指定字符编码,那会很好,但是除非有人发表评论,否则我认为这是不可能的。

请参阅此处,了解来自Org / Python的讨论和调试会话,其中显示了内部结构:

有关BitBucket的问题的讨论

您是否将utf-8声明为python代码中的编码? python 2默认使用ascii。 也许添加

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM