2013-06-19 5 views
4

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

Я нашел многократные ответы, касающиеся кодирования/декодирования, при попытке распечатать информацию из 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 

и в том числе наверху var

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

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

ответ

0

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

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

(см. стр. 17 из http://www.openoffice.org/sc/excelfileformat.pdf)

0

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

1

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

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

workbook = xlrd.open_workbook(path, encoding_override="cp1251") 
Смежные вопросы