【问题标题】:Passing utf-8 table to python from org-mode从 org-mode 将 utf-8 表传递给 python
【发布时间】:2017-05-16 13:17:41
【问题描述】:

当表格包含 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。

谢谢!

更新

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

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

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

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

Discussion of issue on BitBucket

【问题讨论】:

    标签: python pandas emacs org-mode org-babel


    【解决方案1】:

    您是否在您的 Python 代码中声明 utf-8 作为您的编码? python 2 默认使用 ascii。可能会添加

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

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

    【讨论】:

    • 前导码应该注意这一点: :preamble "# -- coding: utf-8 --"
    • 另外——我认为这只控制实际python脚本本身的编码,而不是从emacs传入的var的内容?
    • 是的,对不起,你是对的。你的问题让我想起了我偶然发现的东西,但我有硬编码的字符串。
    猜你喜欢
    • 1970-01-01
    • 2011-05-10
    • 2011-08-31
    • 1970-01-01
    • 2011-05-04
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多