导出包含变音符的数据为Excel可读的.csv格式



我在Mac OS X 10.8.2上使用Python 2.7.2我需要写一个.csv文件,其中通常包含几个"Umlauts"如ä, ö和ü。当我写。csv文件时,Numbers和Open Office都能正确读取csv,也能显示Umlauts,没有任何问题。

但是如果我在Microsoft Excel 2004中阅读的话单词是这样显示的:

TuÃàrlersee

我知道,Excel有问题处理UTF-8。我读到2007年以下的Excel版本不能正确读取UTF-8文件,即使你已经设置了UTF-8 BOM(字节顺序标记)。我用以下行设置UTF-8 BOM:

e.write(codecs.BOM_UTF8)

所以我下一步尝试的不是将其导出为UTF-8文件,而是将字符编码设置为mac-roman。在下面这行代码中,我将该值从utf-8解码,并用mac-roman重新编码。

projectName = projectDict['ProjectName'].decode('utf-8').encode('mac-roman')

但是我收到以下错误:

UnicodeEncodeError: 'charmap' codec can't encode character u'u0308' in position 6: character maps to <undefined>

我如何将此数据导出到Excel能够正确读取Umlauts的。csv ? Python内部处理所有UTF-8格式的内容。或者也许我没有正确理解解码/编码。在Python 3.0中,他们已经适应了整个编码/解码模型,但我需要留在2.7.2版本..

我是这样使用dictwwriter的:

w = csv.DictWriter(e, fieldnames=fieldnames, extrasaction='ignore', delimiter=';', quotechar='"', quoting=csv.QUOTE_NONNUMERIC)
w.writeheader()

u0308为联合通气;在解码为mac-roman:

之前,您需要规范化unicode字符串。
import unicodedata
unicodedata.normalize('NFC', projectDict['ProjectName'].decode('utf-8')).encode('mac-roman')

演示,将非规范化形式的ä字符(a +组合diaeresis)编码为规范化后的合成字符:

>>> unicodedata.normalize('NFC', u'au0308').encode('mac-roman')
'x8a'

我过去曾使用这种技术为特定的客户端生成CSV,这些客户端的平台编码是预先知道的(Excel将以当前的Windows编码IIRC解释文件)。在这种情况下,我编码为windows-1252

CSV文件实际上只意味着在ASCII -如果你正在做的只是写数据导入到Excel以后,那么我写它作为一个Excel工作簿开始,这将避免不得不与这种东西搞混。

查看http://www.python-excel.org/xlwt模块

最新更新