0

当表包含 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 字符串?

我相信如果是这种情况,那么在尝试使用 tabluate 库转换回 org-table 时,它​​将避免进一步的错误。制表库在不使用我的重新编码为 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。

谢谢!

更新

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

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

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

请参阅此处以获取来自 Org/Python 的讨论和调试会话,这些会话显示了内部结构:

BitBucket 上的问题讨论

4

1 回答 1

0

你在你的 python 代码中声明 utf-8 作为你的编码吗?python 2 默认使用 ascii。也许添加

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

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

于 2017-05-16T14:43:47.587 回答