Python pandas 无法读取带有一些奇怪编码和拆分 Pane 的旧 excel 文件

标签 python excel encoding pandas

我正在尝试将旧的 excel 文件导入 pandas。该文件是由 cropSyst 软件使用旧格式(我不知道)生成的,默认情况下它具有拆分 Pane 。这是快照

excel preview

一个解决方案可能是用excel打开文件并保存在xlsx中:这样pandas可以毫无问题地读取它,但是我必须处理大量文件(> 40000)所以它不可行。

当尝试用 pandas 导入它时

pd.read_excel(filename)

我收到这个错误

error: unpack requires a string argument of length 3
*** No CODEPAGE record, no encoding_override: will use 'ascii'

我也尝试将其导入为 csv

pd.read_csv(filename)

但它只读取一些数据,我尝试使用行分隔符和单元格定界符的不同组合,但没有成功。

data read from csv parser

你有什么建议吗?

编辑

正如@jmcnamara 在评论中所建议的那样,我尝试使用 Python 中可用的所有编码来覆盖文件的编码,但仍然没有运气:它没有正确解析文件。

这里可以下载其中一个xls文件

https://drive.google.com/file/d/0B5smcFuBd6EtdFE5eEktZXZVTkU/view?usp=sharing

最佳答案

文件格式为 Excel 2 (BIFF2)。

但是,由于它不是由 Excel 创建的,因此它似乎与 Excel BIFF2 规范不一致。

对于您显示的文件,WINDOW2 记录不正确。您可以通过获取当前版本的 xlrd (0.9.3) 并应用以下补丁来解决此问题:

diff --git a/xlrd/sheet.py b/xlrd/sheet.py
index 36438a0..6d895c4 100644
--- a/xlrd/sheet.py
+++ b/xlrd/sheet.py
@@ -1455,7 +1455,8 @@ class Sheet(BaseObject):
                     (self.first_visible_rowx, self.first_visible_colx,
                     self.automatic_grid_line_colour,
                     ) = unpack("<HHB", data[5:10])
-                    self.gridline_colour_rgb = unpack("<BBB", data[10:13])
+                    if data_len > 10:
+                        self.gridline_colour_rgb = unpack("<BBB", data[10:13])
                     self.gridline_colour_index = nearest_colour_index(
                         self.book.colour_map, self.gridline_colour_rgb, debug=0)
                     self.cached_page_break_preview_mag_factor = 0 # default (60%)

然后安装此版本的模块或从您的 PYTHONPATH 使用它,因为 pandas 使用 xlrd 读取 Excel 文件。

这仍然会给出代码页警告,但这只是一个警告,您可以使用 encoding_override='ascii'(或任何正确的编码,但 ascii 可能是正确的)。

请注意,考虑到您有 40,000 个文件,文件格式可能还有其他问题,但这是我在您提供的文件中找到的唯一一个。

更新:根据第二个示例文件,编码似乎是 Windows CP-1252,因此以下内容应该有效:

import xlrd 

workbook = xlrd.open_workbook('harvest.xls', encoding_override='cp1252') 

关于Python pandas 无法读取带有一些奇怪编码和拆分 Pane 的旧 excel 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26970422/

相关文章:

python - 使用 beautifulsoup 获取跨度标题

python - 将 pandas 数据框列中的值替换为前一个值

Python - 你能为我解释一下这个 while 循环吗?

excel - 我如何在vba中正确格式化它

excel - Excel VBA 是否将字符 ChrW(&H1D48) 解释为上标 d?

encoding - 如何在 http 响应正文中返回编码字符串?

python - 无法打开使用 PyInstaller 创建的桌面应用程序

c++ - QPluginLoader 与 PyQt 模块作为插件 : possible?

c# - excel导出异常

python - Unicode编码错误: 'ascii' codec can't encode characters in position 10-11: ordinal not in range(128)