当表包含 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 的讨论和调试会话,这些会话显示了内部结构: