将包含元音变音的数据导出到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/ 。