【发布时间】:2010-11-14 10:01:14
【问题描述】:
我正在尝试使用 Python xlrd 和 csv 模块将 Excel 电子表格转换为 CSV,但我对编码问题感到困惑。 Xlrd 以 Unicode 格式从 Excel 生成输出,而 CSV 模块需要 UTF-8。
我认为这与 xlrd 模块无关:在输出到标准输出或其他不需要特定编码的输出时一切正常。
工作表编码为 UTF-16-LE,根据book.encoding
我正在做的简化版是:
from xlrd import *
import csv
b = open_workbook('file.xls')
s = b.sheet_by_name('Export')
bc = open('file.csv','w')
bcw = csv.writer(bc,csv.excel,b.encoding)
for row in range(s.nrows):
this_row = []
for col in range(s.ncols):
this_row.append(s.cell_value(row,col))
bcw.writerow(this_row)
这会产生以下错误,大约 740 行:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xed' in position 5: ordinal not in range(128)
该值似乎被挂断为“516-777316”——原始 Excel 工作表中的文本为“516-7773167”(末尾为 7)
我将是第一个承认我对字符编码的工作原理只有模糊认识的人,所以到目前为止我尝试过的大部分都是@987654326 上.encode 和.decode 的各种摸索排列@
如果有人可以提出解决方案,我将不胜感激 - 如果您能解释什么不工作以及为什么不工作,那就更好了,这样我以后可以更轻松地自己调试这些问题。
提前致谢!
编辑:
感谢到目前为止的 cmets。
当我使用 this_row.append(s.cell(row,col))(例如 s.cell 而不是 s.cell_value)时,整个文档都会正确写入。
输出不是特别理想 (text:u'516-7773167'),但它避免了错误,即使有问题的字符仍在输出中。
这让我觉得挑战可能在 xlrd 中。
想法?
【问题讨论】:
-
查看整个回溯,知道谁在抛出错误会很有用。
-
没什么可看的:文件“the_script.py”,第 40 行,在
this_row.append(str(s.cell_value(row,col))) UnicodeEncodeError: 'ascii' codec无法在位置 5 对字符 u'\xed' 进行编码:序数不在范围内(128) -
使用“Unicode 格式的 Excel 输出”,您的意思似乎是“UTF-16 格式的 Excel 输出”。 Unicode 定义了一个代码空间,它由不同的编码系统表示,例如 UTF-8 或 UTF-16。
-
@anschauung:感谢您的评论和投票。现在轮到你帮忙解释了,尤其是关于“516-7773167”之谜。
-
@John:没有忽略你的询问——只是仍然被这个问题难住了。它肯定与那个特定的字符串有关,但我能想出的最佳答案是电子表格——来自第三方应用程序——错误地识别了编码,导致 xlrd 抓取了太多字符或错误的字符,试图理解它。不幸的是,我仍然缺乏检验该假设的技能,但当我这样做时,我会再次触及基础。
标签: python unicode encoding csv xlrd