将包含元音变音的数据导出到Excel可读的.csv文件中

我在Mac OS X 10.8.2上使用Python 2.7.2我需要编写一个.csv文件,其中经常包含几个“变音符号”,如ä,ö和ü。 当我编写.csv文件时,Numbers和Open Office都能够正确读取csv,并且显示Umlauts没有任何问题。

但是,如果我用Microsoft Excel 2004读取它,则显示如下:

TuÃàrlersee 

我知道,Excel有处理UTF-8的问题。 我读过2007年以下的Excel版本,即使已经设置了UTF-8 BOM(字节顺序标记),也无法正确读取UTF-8文件。 我正在用以下行设置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> 

如何将这些数据导出到.csv文件中,Excel能够正确读取Umlauts? Python内部处理UTF-8中的所有内容。 或者,也许我没有正确理解解码/编码。 在Python 3.0中,他们已经调整了整个编码/解码模型,但是我需要继续使用2.7.2版本。

我正在使用DictWriter:

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

\u0308是一个结合了diaeresis; 你需要在解码到mac-roman之前规范你的unicodestring :

 import unicodedata unicodedata.normalize('NFC', projectDict['ProjectName'].decode('utf-8')).encode('mac-roman') 

演示,编码一个非规范化forms的字符(加上组合diaeresis)到macroman后归一化为组成字符:

 >>> unicodedata.normalize('NFC', u'a\u0308').encode('mac-roman') '\x8a' 

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

CSV文件实际上只是用ASCII编写的 – 如果你正在做的只是把数据导出到Excel以后,那么我会把它写成一个Excel工作簿,以避免不必要的种东西。

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