Фон: В «современном» (Excel 97-2003) XLS-файле текст эффективно сохраняется как Unicode. В старых файлах текст сохраняется как 8-битные строки, а запись «кодовой страницы» указывает, как она кодируется, например. целое число 1252 соответствует кодированию, известному как cp1252
или windows-1252
. В любом случае xlrd
представляет извлеченный текст как объекты unicode.
Пожалуйста, вставьте эту строку в код:
print data.biff_version, data.codepage, data.encoding
Если у вас есть новый файл, вы должны увидеть
80 1200 utf_16_le
В любом случае, пожалуйста, измените ваш вопрос, чтобы сообщить о результатах.
Проблема 1: encoding_override
требуется ТОЛЬКО, если файл является старым файлом И вы знаете/подозреваете, что запись кодовой страницы опущена или неверна. Он игнорируется, если файл является новым файлом. Вы действительно знаете, что файл pre-Excel-97 и текст закодирован в UTF-8? Если это так, оно может быть создано только каким-то серьезно запутанным сторонним программным обеспечением, и Excel взорвется, если вы попытаетесь открыть его с помощью Excel; посетите автора с бейсбольной битой. В противном случае не используйте encoding_override.
Задача 2: Вы должны имеют unicode
объектов. Чтобы отобразить их, вам необходимо: encode (не декодировать) их от unicode
до str
с использованием подходящей кодировки. Очень удивительно, что print unicode_object.decode('shift-jis')
не вызывает исключение и печатает вопросительные знаки.
Чтобы понять это, пожалуйста, изменить код, чтобы быть похожим на это:
text = a.rowvalues(i)[1]
print i, repr(text)
print repr(text.decode('shift-jis'))
и доложить о результатах.
Так что мы можем помочь вам выбрать подходящую кодировку (если таковые имеются), скажите нам, что версия о том, что операционная система, которую вы используете, и следующий экран:
print sys.stdout.encoding
import locale
print locale.getpreferredencoding()
Дальнейшее чтение:
(1) документация xlrd (раздел «Юникод», справа вверху) ... включен в дистрибутив или получить последнюю фиксацию here.
(2) Python Unicode HOWTO.
Похоже, вы читаете файл как UTF-8, а затем пытаетесь интерпретировать что-то как Shift JIS? Я не ожидал, что это сработает! –