чтение юникода из xls в python

Я пытаюсь прочитать с помощью Python файл .xls. Файл содержит несколько символов, отличных от ascii (а именно, äöü). Я пробовал как с openpyxls, так и с xlrd (у меня были большие надежды на xlrd, поскольку он все равно читал все в юникоде), но ни один из них не работал.

Я нашел несколько ответов, касающихся кодирования/декодирования, при попытке распечатать информацию из xls, но я даже не могу зайти так далеко. Этот скрипт выдает ошибку сразу после простой попытки прочитать файл:

import xlrd
workbook = xlrd.open_workbook('export_data.xls')

В результате чего:

Traceback (most recent call last):
  File "C:\Users\Administrator\workspace\tufinderxlstoxml\tufinderxlstoxml2.py", line 2, in <module>
    workbook = xlrd.open_workbook('export_data.xls')
  File "C:\Python27_32\lib\site-packages\xlrd\__init__.py", line 435, in open_workbook
    ragged_rows=ragged_rows,
  File "C:\Python27_32\lib\site-packages\xlrd\book.py", line 119, in open_workbook_xls
    bk.get_sheets()
  File "C:\Python27_32\lib\site-packages\xlrd\book.py", line 705, in get_sheets
    self.get_sheet(sheetno)
  File "C:\Python27_32\lib\site-packages\xlrd\book.py", line 696, in get_sheet
    sh.read(self)
  File "C:\Python27_32\lib\site-packages\xlrd\sheet.py", line 796, in read
    strg = unpack_string(data, 6, bk.encoding or bk.derive_encoding(), lenlen=2)
  File "C:\Python27_32\lib\site-packages\xlrd\biffh.py", line 269, in unpack_string
    return unicode(data[pos:pos+nchars], encoding)
UnicodeDecodeError: 'ascii' codec can't decode byte 0x92 in position 55: ordinal not in range(128)
WARNING *** OLE2 inconsistency: SSCS size is 0 but SSAT size is non-zero
*** No CODEPAGE record, no encoding_override: will use 'ascii'
*** No CODEPAGE record, no encoding_override: will use 'ascii'

Я также пробовал:

workbook = xlrd.open_workbook('export_data.xls', encoding_override="utf-8")

в результате чего:

Traceback (most recent call last):
  File "C:\Users\Administrator\workspace\tufinderxlstoxml\tufinderxlstoxml2.py", line 2, in <module>
    workbook = xlrd.open_workbook('export_data.xls', encoding_override="utf-8")
  File "C:\Python27_32\lib\site-packages\xlrd\__init__.py", line 435, in open_workbook
    ragged_rows=ragged_rows,
  File "C:\Python27_32\lib\site-packages\xlrd\book.py", line 119, in open_workbook_xls
    bk.get_sheets()
  File "C:\Python27_32\lib\site-packages\xlrd\book.py", line 705, in get_sheets
    self.get_sheet(sheetno)
  File "C:\Python27_32\lib\site-packages\xlrd\book.py", line 696, in get_sheet
    sh.read(self)
  File "C:\Python27_32\lib\site-packages\xlrd\sheet.py", line 796, in read
    strg = unpack_string(data, 6, bk.encoding or bk.derive_encoding(), lenlen=2)
  File "C:\Python27_32\lib\site-packages\xlrd\biffh.py", line 269, in unpack_string
    return unicode(data[pos:pos+nchars], encoding)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x92 in position 55: invalid start byte
WARNING *** OLE2 inconsistency: SSCS size is 0 but SSAT size is non-zero

и в том числе вверху различные версии:

# -*- coding: utf-8 -*-

Я запускаю это на python 2.7 на компьютере с Windows Server 2008.


person cmacdona101    schedule 19.06.2013    source источник


Ответы (3)


Спасибо всем за отзывы!

В конце концов я исправил это с помощью функции encoding_override. Мне не удалось найти документацию Microsoft, в которой код cp соответствует немецким символам, поэтому я попробовал их все. В конце концов я добрался до cp1251, и это сработало!

workbook = xlrd.open_workbook(path, encoding_override="cp1251")
person cmacdona101    schedule 03.12.2014

Из моего чтения документов OOo, xls использовал вариант utf_16_le unicode, а не utf8 (то есть он использует ровно два байта на символ, хранящийся с прямым порядком байтов), поэтому попробуйте:

workbook = xlrd.open_workbook('export_data.xls', encoding_override="utf_16_le")

(см. стр. 17 документа http://www.openoffice.org/sc/excelfileformat.pdf)

person James K    schedule 13.10.2013

Немного поздно, но я надеюсь, что вы попробовали unicodecsv для кодировки.

person Timmay    schedule 27.03.2014