Я пытаюсь перевести электронную таблицу Excel в CSV, используя модули Python xlrd и csv, но я повесил трубку на проблемы с кодировкой. Xlrd производит вывод из Excel в Unicode, а для модуля CSV требуется UTF-8.
Я понял, что это не имеет ничего общего с модулем xlrd: все работает отлично, выводя на stdout или другие выходы, для которых не требуется конкретная кодировка.
Рабочий лист кодируется как 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 на конце)
Я буду первым, кто признает, что у меня есть только смутное представление о том, как работает кодировка символов, поэтому большинство из того, что я пробовал до сих пор, - это различные неудобные перестановки .encode
и .decode
на s.cell_value(row,col)
Если кто-то может предложить решение, я был бы признателен - даже лучше, если бы вы могли дать объяснение, что не работает и почему, чтобы я мог более легко отлаживать эти проблемы самостоятельно в будущем.
Спасибо заранее!
EDIT:
Спасибо за комментарии до сих пор.
Когда я пользователь this_row.append(s.cell(row,col))
(например, s.cell вместо s.cell_value), весь документ записывается без ошибок.
Вывод не является особенно желательным (text:u'516-7773167'
), но он избегает ошибки, даже если оскорбительные символы все еще находятся на выходе.
Это заставляет меня думать, что проблема может быть в xlrd в конце концов.
Мысли?