[英]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的讨论和调试会话,其中显示了内部结构:
您是否将utf-8声明为python代码中的编码? python 2默认使用ascii。 也许添加
# -*- coding: utf-8 -*-
因为您的第一行将解决您的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.