2

我在Mac OS X 10.8.2上使用Python 2.7.2我需要编写一个 .csv 文件,该文件通常包含几个“元音变音”,如 ä、ö 和 ü。当我编写 .csv 文件时,Numbers 和 Open Office 都能够正确读取 csv 并且还可以毫无问题地显示变音符号。

但如果我用 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 能够正确读取元音变音的 .csv 文件中?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()
4

2 回答 2

8

\u0308组合分音符;在解码为 mac-roman 之前,您需要标准化您的 unicode 字符串:

import unicodedata

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

演示,将ä非规范化形式的字符(a加上组合分音符号)在规范化为组合字符后编码为 mac-roman:

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

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

于 2012-12-21T14:31:18.940 回答
0

CSV 文件实际上只是 ASCII 格式 - 如果您正在做的只是写出数据以便稍后导入 Excel,那么我会将其写为 Excel 工作簿开始,这样可以避免为此烦恼种东西。

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

于 2012-12-21T14:30:46.490 回答