Pandas.read_excel 读取 xlsx 文件集时出现 KeyError

2024-04-06

我使用 Anaconda shell 进行数据分析 上传到pandas一堆excel文件(25个文件) 在此文件上https://www.dropbox.com/s/16ea1cw6k63i16p/Newdata.zip?dl=0 https://www.dropbox.com/s/16ea1cw6k63i16p/Newdata.zip?dl=0我收到错误。找不到原因以及如何修复它。

import pandas as pd
import numpy as np
import os

os.chdir(r"C:\Users\Twentyouts\Desktop\Newdata" )
path = os.getcwd()

files = os.listdir(path)
files_xlsx = [f for f in files if f[-4:] == 'xlsx']

for f in files_xlsx:
    print(f)
    loading = pd.read_excel(f, heading = 0)
    df = df.append(loading)
2016-06-20–2016-06-26.xlsx
2016-06-27–2016-07-03.xlsx
2016-07-04–2016-07-10.xlsx
2016-07-11–2016-07-17.xlsx
2016-08-01–2016-08-07.xlsx
2016-08-15–2016-08-21.xlsx

KeyError                                  Traceback (most recent call last)
<ipython-input-23-5737d4d13b9f> in <module>()
      1 df = pd.DataFrame()
----> 2 pd.read_excel('2016-08-15–2016-08-21.xlsx')

C:\Users\Twentyouts\Anaconda3\lib\site-packages\pandas\io\excel.py in read_excel(io, sheetname, header, skiprows, skip_footer, index_col, names, parse_cols, parse_dates, date_parser, na_values, thousands, convert_float, has_index_names, converters, true_values, false_values, engine, squeeze, **kwds)
    189 
    190     if not isinstance(io, ExcelFile):
--> 191         io = ExcelFile(io, engine=engine)
    192 
    193     return io._parse_excel(

C:\Users\Twentyouts\Anaconda3\lib\site-packages\pandas\io\excel.py in __init__(self, io, **kwds)
    247             self.book = xlrd.open_workbook(file_contents=data)
    248         elif isinstance(io, compat.string_types):
--> 249             self.book = xlrd.open_workbook(io)
    250         else:
    251             raise ValueError('Must explicitly set engine if not passing in'

C:\Users\Twentyouts\Anaconda3\lib\site-packages\xlrd\__init__.py in open_workbook(filename, logfile, verbosity, use_mmap, file_contents, encoding_override, formatting_info, on_demand, ragged_rows)
    420                 formatting_info=formatting_info,
    421                 on_demand=on_demand,
--> 422                 ragged_rows=ragged_rows,
    423                 )
    424             return bk

C:\Users\Twentyouts\Anaconda3\lib\site-packages\xlrd\xlsx.py in open_workbook_2007_xml(zf, component_names, logfile, verbosity, use_mmap, formatting_info, on_demand, ragged_rows)
    831         x12sheet = X12Sheet(sheet, logfile, verbosity)
    832         heading = "Sheet %r (sheetx=%d) from %r" % (sheet.name, sheetx, fname)
--> 833         x12sheet.process_stream(zflo, heading)
    834         del zflo
    835 

C:\Users\Twentyouts\Anaconda3\lib\site-packages\xlrd\xlsx.py in own_process_stream(self, stream, heading)
    546         for event, elem in ET.iterparse(stream):
    547             if elem.tag == row_tag:
--> 548                 self_do_row(elem)
    549                 elem.clear() # destroy all child elements (cells)
    550             elif elem.tag == U_SSML12 + "dimension":

C:\Users\Twentyouts\Anaconda3\lib\site-packages\xlrd\xlsx.py in do_row(self, row_elem)
    743                     else:
    744                         bad_child_tag(child_tag)
--> 745                 value = error_code_from_text[tvalue]
    746                 self.sheet.put_cell(rowx, colx, XL_CELL_ERROR, value, xf_index)
    747             elif cell_type == "inlineStr":

KeyError: None

事实上,正如 @MaxU 指出的那样,Excel 文件格式错误,但有趣的是,当正确保存为 .xlsx 文件时,它确实可以解决。可能是尝试通过简单地将扩展名更改为 .xlsx 来从以前的 .xls 版本升级无效文件。这两种文件格式不是可以毫无危险地更改扩展名的简单文本文件,而是非常不同的二进制格式。

考虑使用运行 COM 接口wn32com使用 Excel 的模块将格式错误的文件正确保存到实际的 OpenXML 工作簿中工作簿.另存为 https://msdn.microsoft.com/en-us/library/office/ff841185.aspx方法。注意:此解决方案仅适用于安装了 MS Excel 的 Windows 的 Python。

import pandas as pd
import glob
import win32com.client as win32

xlsxfiles = glob.glob("C:\\Path\\To\\Workbooks\\*.xlsx")

def save_xlsx(srcfile):
    try:
        newfile = srcfile.replace('.xlsx', '_new.xlsx')
        print('Malformed file saved as {}'.format(newfile))
        xlApp = win32.gencache.EnsureDispatch('Excel.Application')
        wb = xlApp.Workbooks.Open(srcfile)
        wb.SaveAs(newfile, 51)                 

    except Exception as e:
        print(e)            
    finally:
        wb.Close(True); wb = None
        xlApp.Quit; xlApp = None    
    return newfile

def xl_read():    
    dfs = []
    for f in xlsxfiles:        
        try:
            df = pd.read_excel(f)
        except Exception as e:            
            df = pd.read_excel(save_xlsx(f))

        print('File: {}, Shape: {}'.format(f, df.shape))
        dfs.append(df)            
    return pd.concat(dfs)

print('Final dataframe shape: {}'.format(xl_read().shape))  

Output (最终数据帧为 330,257 行和 30 列)

File: C:\Path\To\Workbooks\2016-06-20–2016-06-26.xlsx, Shape: (5912, 27)
File: C:\Path\To\Workbooks\2016-06-27–2016-07-03.xlsx, Shape: (5362, 27)
File: C:\Path\To\Workbooks\2016-07-04–2016-07-10.xlsx, Shape: (5387, 27)
File: C:\Path\To\Workbooks\2016-07-11–2016-07-17.xlsx, Shape: (5331, 28)
File: C:\Path\To\Workbooks\2016-08-01–2016-08-07.xlsx, Shape: (4965, 28)
Malformed file saved as C:\Path\To\Workbooks\2016-08-15–2016-08-21_new.xlsx
File: C:\Path\To\Workbooks\2016-08-15–2016-08-21.xlsx, Shape: (5315, 27)
File: C:\Path\To\Workbooks\2016-08-22–2016-08-28.xlsx, Shape: (5179, 27)
File: C:\Path\To\Workbooks\2016-08-29–2016-09-04.xlsx, Shape: (5855, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-09-05–2016-09-11_new.xlsx
File: C:\Path\To\Workbooks\2016-09-05–2016-09-11.xlsx, Shape: (5838, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-09-12–2016-09-18_new.xlsx
File: C:\Path\To\Workbooks\2016-09-12–2016-09-18.xlsx, Shape: (5729, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-09-19–2016-09-25_new.xlsx
File: C:\Path\To\Workbooks\2016-09-19–2016-09-25.xlsx, Shape: (6401, 27)
File: C:\Path\To\Workbooks\2016-09-26–2016-10-02.xlsx, Shape: (7018, 27)
File: C:\Path\To\Workbooks\2016-09.xlsx, Shape: (23874, 27)
File: C:\Path\To\Workbooks\2016-10-03–2016-10-09.xlsx, Shape: (6587, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-10-10–2016-10-12_new.xlsx
File: C:\Path\To\Workbooks\2016-10-10–2016-10-12.xlsx, Shape: (2883, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-10-10–2016-10-13_new.xlsx
File: C:\Path\To\Workbooks\2016-10-10–2016-10-13.xlsx, Shape: (4174, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-10-17–2016-10-20_new.xlsx
File: C:\Path\To\Workbooks\2016-10-17–2016-10-20.xlsx, Shape: (4560, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-10-17–2016-10-23_new.xlsx
File: C:\Path\To\Workbooks\2016-10-17–2016-10-23.xlsx, Shape: (7111, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-10-24–2016-10-27_new.xlsx
File: C:\Path\To\Workbooks\2016-10-24–2016-10-27.xlsx, Shape: (4921, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-10-24–2016-10-30_new.xlsx
File: C:\Path\To\Workbooks\2016-10-24–2016-10-30.xlsx, Shape: (8005, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-10-31–2016-11-06_new.xlsx
File: C:\Path\To\Workbooks\2016-10-31–2016-11-06.xlsx, Shape: (7029, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-10_new.xlsx
File: C:\Path\To\Workbooks\2016-10.xlsx, Shape: (28098, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-11-07–2016-11-13_new.xlsx
File: C:\Path\To\Workbooks\2016-11-07–2016-11-13.xlsx, Shape: (7076, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-11-14–2016-11-20_new.xlsx
File: C:\Path\To\Workbooks\2016-11-14–2016-11-20.xlsx, Shape: (7758, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-11-21_new.xlsx
File: C:\Path\To\Workbooks\2016-11-21.xlsx, Shape: (1689, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-11-21–2016-11-23_new.xlsx
File: C:\Path\To\Workbooks\2016-11-21–2016-11-23.xlsx, Shape: (4711, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-11-28–2016-12-04_new.xlsx
File: C:\Path\To\Workbooks\2016-11-28–2016-12-04.xlsx, Shape: (9286, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-11_new.xlsx
File: C:\Path\To\Workbooks\2016-11.xlsx, Shape: (30505, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-12-05–2016-12-11_new.xlsx
File: C:\Path\To\Workbooks\2016-12-05–2016-12-11.xlsx, Shape: (8802, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-12-12–2016-12-18_new.xlsx
File: C:\Path\To\Workbooks\2016-12-12–2016-12-18.xlsx, Shape: (8333, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-12-16–2016-12-22_new.xlsx
File: C:\Path\To\Workbooks\2016-12-16–2016-12-22.xlsx, Shape: (8592, 27)
Malformed file saved as C:\Path\To\Workbooks\2016-12-26–2016-12-31_new.xlsx
File: C:\Path\To\Workbooks\2016-12-26–2016-12-31.xlsx, Shape: (5362, 27)
Malformed file saved as C:\Path\To\Workbooks\2017-01-01–2017-01-08_new.xlsx
File: C:\Path\To\Workbooks\2017-01-01–2017-01-08.xlsx, Shape: (4322, 27)
Malformed file saved as C:\Path\To\Workbooks\2017-01-09–2017-01-15_new.xlsx
File: C:\Path\To\Workbooks\2017-01-09–2017-01-15.xlsx, Shape: (7608, 27)
Malformed file saved as C:\Path\To\Workbooks\2017-01-23–2017-01-29_new.xlsx
File: C:\Path\To\Workbooks\2017-01-23–2017-01-29.xlsx, Shape: (8903, 27)
Malformed file saved as C:\Path\To\Workbooks\2017-01-30–2017-02-05_new.xlsx
File: C:\Path\To\Workbooks\2017-01-30–2017-02-05.xlsx, Shape: (9173, 27)
Malformed file saved as C:\Path\To\Workbooks\2017-02-13–2017-02-12_new.xlsx
File: C:\Path\To\Workbooks\2017-02-13–2017-02-12.xlsx, Shape: (9144, 27)
Malformed file saved as C:\Path\To\Workbooks\2017-02-13–2017-02-19_new.xlsx
File: C:\Path\To\Workbooks\2017-02-13–2017-02-19.xlsx, Shape: (9911, 27)
File: C:\Path\To\Workbooks\test.xlsx, Shape: (5315, 27)
Malformed file saved as C:\Path\To\Workbooks\Выгрузка 12-15.12_new.xlsx
File: C:\Path\To\Workbooks\Выгрузка 12-15.12.xlsx, Shape: (4818, 27)
Malformed file saved as C:\Path\To\Workbooks\Выгрузка 21-27_new.xlsx
File: C:\Path\To\Workbooks\Выгрузка 21-27.xlsx, Shape: (8876, 27)
File: C:\Path\To\Workbooks\Выгрузка 26-29.12.xlsx, Shape: (4539, 27)
Final dataframe shape: (330257, 30)

甚至考虑使用 Windows ACE Engine 的数据库引擎方法pyodbc用pandas查询对应的工作簿read_sql http://pandas.pydata.org/pandas-docs/version/0.19.2/generated/pandas.read_sql.html因为每个都共享相同的工作表名称,TDSheet.

#...same as above
import pyodbc

def sql_read():    
    dfs = [] 
    for f in xlsxfiles:                
        try:
            conn = pyodbc.connect('Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};'+\
                      'DBQ=C:\\Path\\To\\Workbooks\\{};'.format(f), autocommit=True)
            df =  pd.read_sql('SELECT * FROM [TDSheet$];', conn)

        except Exception as e:
            conn.close()
            conn = pyodbc.connect('Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};'+\
                      'DBQ=C:\\Path\\To\\Workbooks\\{};'.format(save_xlsx(f)), autocommit=True)
            df = pd.read_excel('SELECT * FROM [TDSheet$];', conn)
            conn.close()

        print('File: {}, Shape: {}'.format(f, df.shape))
        dfs.append(df)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pandas.read_excel 读取 xlsx 文件集时出现 KeyError 的相关文章

随机推荐

  • Ruby 中的 % 运算符在 N % 2 中起什么作用?

    if counter 2 1我正在尝试解码这一行 这是一个 Rails 项目 我正在尝试弄清楚 在这个 if 语句中执行 is the modulo http en wikipedia org wiki Modulo operator操作员
  • 在 Runtime.getRuntime().exec() 中出现错误:/bin/bash:没有这样的文件或目录[重复]

    这个问题在这里已经有答案了 我正在尝试从 java 代码执行以下操作 String cmd bin bash netstat nr grep 0 0 0 0 awk print 2 Process process Runtime getRu
  • 为什么用字母L来表示宽字符串?

    例如 wchar t str L hello 为什么是 L 而不是其他字母 MSDN 声称它代表字符串Literal 即输入的字符串不应被翻译成其他任何内容
  • 如何找到物体的中心?

    二值化后我有黑白图像 之后我得到了一个形状不规则的物体 该图片的链接如下 我怎样才能把这个物体刻在圆圈上 或者我怎样才能找到这个物体的 中心 您可以找到重心使用一个简单的公式计算像素的值 该公式是 x 坐标之和除以点数 以及 y 坐标之和除
  • Python 中的私有方法

    我想在我的类中有一个函数 我将仅在此类的方法内部使用该函数 我不会在这些方法的实现之外调用它 在 C 中 我将使用在类的私有部分中声明的方法 在Python中实现这样的功能的最佳方法是什么 我正在考虑在这种情况下使用静态装饰器 我可以使用没
  • 如何使用 Apache POI 在 Word 文档中插入图像?

    我有这个代码 public class ImageAttachmentInDocument param args throws IOException throws InvalidFormatException public static
  • eclipse插件编程时出现“Workbench尚未创建”错误

    随着我的 eclipse 插件启动 我得到了Root exception java lang IllegalStateException Workbench has not been created yet error 而且它似乎会导致产生
  • PHP/Symfony2 表单复选框字段

    Orm My SampleBundle Entity Subject type entity id id type integer generator strategy AUTO fields motion type smallint un
  • 理解含义的算法[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想知道是否有任何特定的算法可以遵循
  • Vue:选择下拉菜单在更改值时清除其他输入

    我有一个带有输入值的表单 当我选择带有 v model 的选项并更改下拉值时 之前字段的输入将被清除 我制作了一个简单的代码笔来演示这一点 一段时间以来 这一直是我的痛点 但现在它开始干扰客户体验 所以我想看看为什么会发生这种情况 http
  • 带通配符的 FTP 目录部分列表

    首先我问 ftp 目录列表超时 大量子目录 https stackoverflow com questions 9230485 ftp directory listing timeout huge number of subdirs 我得到
  • 在 JFrame 中组织多个 JPanel 的好方法是什么?

    我想做的是在框架内组织五个独立的 JPanel 输出应如下所示 顶部将有一个面板 顶部面板正下方的两个面板垂直分割空间 然后另外两个面板水平分割剩余空间 我无法弄清楚如何组织如上所述的面板 我认为这是因为我不知道正确的语法 因此 非常感谢任
  • 引用在嵌套结构中的生存时间不够长

    我正在创建一系列数据结构 其中包含对较低级别结构的可变引用 我一直很愉快地与A B and C下面但我尝试添加一个新层D A B C D实际上是用于协议解码的状态机的状态 但我在这里删除了所有这些 struct A fn init A gt
  • Go 模块在 VSCode 中导入问题(“无法在任何 [...] 中找到包 [...]”)

    我遇到了可能是 Gopls 语言服务器问题 在 VSCode 中使用带有 Go 扩展的 Go 模块时 我的所有外部包导入语句都被标记为不正确 这正是我到目前为止所做的 在我的 GOPATH src github com Kozie1337
  • sbt:选择运行的主类

    我的应用程序中有大约 6 个主要类 但我通常只使用其中一个 所以我想通过 sbt 自动运行它 sbt 使得可以在 build sbt 中定义两个键 Run Key val selectMainClass TaskKey Option Str
  • 无法检索访问令牌 linkedin api

    我正在申请connect with linkedin 我正在关注分步指南 https code google com p simple linkedinphp wiki QuickStart 为了验证用户身份 我寻求了帮助this http
  • 如何绘制具有不同 colspan 的四个子图?

    我尝试使用四张图像来拟合matplotlib pyplot像下面这样 plot1 plot2 plot3 plot4 我发现的大多数例子都涵盖了如下三个图 ax1 plt subplot 221 ax2 plt subplot 222 ax
  • 当我将 targetSDK 设置为 API 30 后,我的 Android 应用程序无法正常工作;我如何找出原因?

    根据Google https developer android com distribute best practices develop target sdk 从 2021 年 8 月开始 所有新的 Google Play 应用程序除了
  • Gatsby 未生成正确的静态 HTML 文件

    我正在开发一个基于盖茨比的网站 到目前为止该网站的开发进展顺利 但在构建生产时遇到了一个问题 即我们在各个页面索引文件中没有获得任何静态 html 相反 Gatsby 似乎将尝试从 javascript 注入页面 这与我们的预期相反 我看到
  • Pandas.read_excel 读取 xlsx 文件集时出现 KeyError

    我使用 Anaconda shell 进行数据分析 上传到pandas一堆excel文件 25个文件 在此文件上https www dropbox com s 16ea1cw6k63i16p Newdata zip dl 0 https w