【问题标题】:Has anyone been able to write out UTF-8 characters using python's xlwt?有没有人能够使用 python 的 xlwt 写出 UTF-8 字符?
【发布时间】:2011-11-03 07:25:23
【问题描述】:

我正在尝试将数据写入包含日文字符的 Excel 文件。 我正在使用 codec.open() 来获取数据,这似乎工作正常,但是当我尝试写入数据时遇到了这个错误:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 16-17: ordinal not in range(128)

我不明白为什么程序会坚持在这里使用 ascii。当我创建一个新的工作簿对象时,我使用了

wb = xlwt.Workbook(encoding='utf-8')

并且程序文件本身和它正在读取的文件都保存为 UTF-8。

有人有什么想法吗?

编辑:这是 xlwt 包的链接。 http://pypi.python.org/pypi/xlwt

【问题讨论】:

  • 你永远不应该写出 UTF-8 字符。
  • 那它们有什么好处呢?
  • 它们大多没用。你应该改用unicodes。
  • xlwt 不是标准库的一部分。最好提供一个链接
  • @Ignacio,我认为你倒退了。 Unicode 是一个没有指定物理表示的概念;当你把它写出来的时候,你必须把它编码成某种东西。 UTF-8 是一个非常好的选择。

标签: python utf-8 multibyte xlwt


【解决方案1】:

在 Excel 97-2003 XLS 文件中,如果可能,每段文本都以latin1 编码,否则以UTF-16LE 编码,并带有一个标志来显示哪个。为此,xlwt 需要一个 unicode 对象。如果调用者提供了一个str 对象,xlwt 将尝试使用 Workbook() 调用中指定的编码对其进行解码(默认为ascii)。

这行得通;尝试运行以下短脚本并使用 Excel 打开生成的文件。

import xlwt
wb = xlwt.Workbook(encoding="UTF-8")
uc = u"".join(unichr(0x0410 + i) for i in xrange(32)) # some Cyrillic characters
u8 = uc.encode("UTF-8")
ws = wb.add_sheet("demo")
ws.write(0, 0, uc)
ws.write(1, 0, u8)
ws.write(2, 0, xlwt.Formula("A1=A2"))
ws.write(3, 0, "ASCII is a subset of UTF-8")
wb.save("xlwt_write_utf8.xls")

您收到的是编码错误,而不是解码错误,这表明您的脚本的文件输入部分可能存在问题。请提供可能导致您遇到的错误的最短脚本。该脚本应该在失败语句之前立即包含类似print repr(your_utf8_text) 的内容,以便我们可以准确地看到文本数据是什么。请包含完整的错误消息和完整的回溯,以及非常短的输入文件的内容 (print repr(contents))。

【讨论】:

  • 效果很好!至少我知道我还有希望。但是数据在到达 xlwt 之前经历了如此多的转换,我认为我不能只发布一个小的 sn-p。我可以告诉你,我认为我的问题在于你的第三行和第四行。您正在从头开始创建 unicode 文本,而我正在从文件中读取它。另外,我认为我的程序中没有使用 .encode。我会尝试并回复你。无论如何,很好的答案。
  • @StormShadow:问题很可能出在“在到达 xlwt 之前进行了如此多的转换”。您需要确定代码失败的位置。这通常是通过检查收到 UnicodeEncodeError 时应生成的回溯来确定的。如果这对您没有帮助,请发布回溯。当您说您没有明确调用encode 时,您可能是正确的;当您混合unicodestr 对象并且内部认为它需要解码str 对象并使用默认编码(在本例中为ascii)时,可能会发生该错误。
【解决方案2】:

按照this问题的建议,在WorkBook上设置编码

wb = xlwt.Workbook(encoding='latin-1') 

应该也能解决这个问题(它对我有用)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 2013-07-14
    • 2011-09-06
    • 2021-08-13
    • 1970-01-01
    相关资源
    最近更新 更多