簡體   English   中英

舊的xls文件出現python xlrd錯誤

[英]python xlrd error with old xls file

我有一個excel文件,它是由一些較舊的軟件創建的。 此文件無法在OpenOffice中打開(某些編碼錯誤),並且最初在Excel 2010中只能在受保護的視圖中打開。 當我嘗試通過xlrd打開它時:

from xlrd import open_workbook
rb = open_workbook('405_mut_1x.xls', encoding_override="utf-8")

我收到一個錯誤:

Traceback (most recent call last):
  File "/home/wintr/PycharmProjects/4lab_1/main.py", line 2, in <module>
    rb = open_workbook('405_mut_1x.xls', encoding_override="utf-8")
  File "/usr/lib/python3/dist-packages/xlrd/__init__.py", line 435, in open_workbook
    ragged_rows=ragged_rows,
  File "/usr/lib/python3/dist-packages/xlrd/book.py", line 107, in open_workbook_xls
    bk.fake_globals_get_sheet()
  File "/usr/lib/python3/dist-packages/xlrd/book.py", line 714, in fake_globals_get_sheet
    self.get_sheets()
  File "/usr/lib/python3/dist-packages/xlrd/book.py", line 705, in get_sheets
    self.get_sheet(sheetno)
  File "/usr/lib/python3/dist-packages/xlrd/book.py", line 696, in get_sheet
    sh.read(self)
  File "/usr/lib/python3/dist-packages/xlrd/sheet.py", line 1467, in read
    self.update_cooked_mag_factors()
  File "/usr/lib/python3/dist-packages/xlrd/sheet.py", line 1535, in update_cooked_mag_factors
    elif not (10 <= zoom <= 400):
TypeError: unorderable types: int() <= NoneType()

使用cp1252,utf-7編碼的方法相同。 utf_16_le,在類似主題返回中建議

ERROR *** codepage None -> encoding 'utf_16_le' -> UnicodeDecodeError: 'utf16' codec can't decode byte 0x6c in position 4: truncated data

沒有編碼我在回溯中得到了額外的字符串

*** No CODEPAGE record, no encoding_override: will use 'ascii'

將文件保存為Excel 2010(xlsx)格式后,此問題消失了-可以同時在xlrd和OO中打開文件。 有什么方法可以通過xlrd打開此類文件而無需重新保存? UPD。 python2.7 xlrd沒有這樣的問題。 但是我仍然不知道python3.3 xlrd有什么問題。

問題出在python2和python3之間的行為不同:

$ python2
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 1 <= None
False

$ python3
Python 3.4.3 (default, Jul 28 2015, 18:20:59) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 1 <= None
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() <= NoneType()

要解決此問題,您可以在1543行附近編輯xlrd / sheet.py:

更改

elif not (10 <= zoom <= 400):

elif zoom is None or not (10 <= zoom <= 400):

因此行為將類似於python2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM