通过read_excel打开xls文件时,报错"struct.error: unpack requires a bytes object of length 2"

通过read_excel打开xls文件时,报错"struct.error: unpack requires a bytes object of length 2"

Excel格式转换摘抄自 阿丙的博客园 链接请点击

1.问题描述

文件夹内存在大量的xls文件,用pandas的read_excel 读取的时候,报错: “struct.error: unpack requires a bytes object of length 2”,尝试通过 read_excel(open(file,‘rb’,encoding=“gbk”)) 换了多种编码格式无果。

open(path) 得到如下输出:
<_io.TextIOWrapper name=‘F://数据//ceshi.xls’ mode=‘r’ encoding=‘cp936’>

2.问题解决

通过以下链接得知问题源于旧有的excel版本文件,可将文件格式替换为xlsx格式即可,亲测成功http://www.itkeyword.com/doc/289515404364052x169/python-pandas-cannot-read-old-excel-files-with-some-strange-encoding-and-split-p

不过文件众多,批量改名并不能达到修改文件格式的目的,通过VB可以实现。

具体实现如下:

执行条件:

  1. Office2007及以上版本的Excel
  2. Excel启用宏

工具下载:
  可以自己新建Excel
功能介绍:
  后面有相应的代码
  《xls2xlsx.xlsm》会在所在文件夹目录中、包括子目录中,遍历所有.xls格式的文件,执行“另存为”操作,然后在原文件当前位置另存为一个同名的.xlsx格式的文件。
  比如:执行前xls2xlsx.xlsm所在的文件夹中有3个.xls格式的文件,同时包含一个子文件夹,子文件夹中也有3个.xls格式的文件
  
  《Convert2xlsx.xlsm》会在所在文件夹目录中(不包括子目录),遍历所有.xls格式的文件,执行“另存为”操作,然后在当前路径下生成一个文件夹xlsx,这个文件夹中放了所有新生成的文件。
  比如:执行前Convert2xlsx.xlsm所在的文件夹中有3个.xls格式的文件

执行方法:
  1、新建一个Excel;
  2、启用宏操作
  一般情况下,打开Excel的时候,会弹出如下警告,如果弹出了这个警告,直接启用就可以了;如果没有出现的话,请参考以下百度经验启用宏http://jingyan.baidu.com/article/39810a23e39b9db637fda651.html
  3、编写执行VBA代码
  这一步新手肯定是不会的,详细地图文介绍就参考百度经验http://jingyan.baidu.com/article/09ea3ede265e8bc0aede39ba.html,我这里只作简单的说明:
  (a)在工作表界面按下组合快捷键Alt+F11或者右键单击任意一个工作表标签,在弹出的右键快捷菜单单击“查看代码”进入VBA编辑环境
  (b)如果是下载的我的工具,可以跳过此步骤;如果是新建的Excel,此时在VBA编辑环境中的“代码窗口”复制粘贴以下两个代码中的一个:

《xls2xlsx.xlsm》

Dim iFile(1 To 100000) As String
Dim count As Integer

Sub xls2xlsx()
    iPath = ThisWorkbook.Path
    On Error Resume Next
    count = 0
    zdir iPath
    For i = 1 To count
        If iFile(i) Like "*.xls" And iFile(i) <> ThisWorkbook.FullName Then
            MyFile = iFile(i)
            FilePath = Replace(MyFile, ".xls", ".xlsx")
            If Dir(FilePath, 16) = Empty Then
                Set WBookOther = Workbooks.Open(MyFile)
                Application.ScreenUpdating = False
                ActiveWorkbook.SaveAs Filename:=FilePath, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
                WBookOther.Close SaveChanges:=False      '解决不能close 文件问题
                Application.ScreenUpdating = True
            End If
        End If
    Next
End Sub

Sub zdir(p)       '访问当前文件夹下所有子文件夹及文件
  Set fs = CreateObject("scripting.filesystemobject")
  For Each f In fs.GetFolder(p).Files
    If f <> ThisWorkbook.FullName Then count = count + 1: iFile(count) = f
  Next
  For Each m In fs.GetFolder(p).SubFolders
      zdir m
  Next
End Sub

《Convert2xlsx.xlsm》

Sub xls2xlsx()
Dim FilePath, MyFile, iPath, Name, OutPath As String
iPath = ThisWorkbook.Path
OutPath = Dir(iPath & "\xlsx", vbDirectory)
If OutPath = "" Then
    MkDir (iPath & "\xlsx")
End If
MyFile = Dir(iPath & "\*.xls")

If MyFile <> "" Then
Do
    On Error Resume Next
    If MyFile = ThisWorkbook.Name Then MyFile = Dir
    Workbooks.Open (iPath & "\" & MyFile)
    MyFile = Replace(MyFile, ".xls", ".xlsx")
    Name = "\" & MyFile
    FilePath = iPath & "\xlsx" & Name
    Application.ScreenUpdating = False
    ActiveWorkbook.SaveAs Filename:=FilePath, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
    Workbooks(MyFile).Close True
    Application.ScreenUpdating = True
    MyFile = Dir
Loop While MyFile <> ""
End If
End Sub

©按下F5快捷键执行这段代码或者在菜单中单击“运行子过程/用户窗体”命令

PS:需要说明的是,在执行过程中,不要去做其他的事情,不然可能会中断程序的运行

过程中可能遇到的问题

  1. 宏功能启用:链接

  2. excel点击 vb,内存溢出
    将VBA6里的VBE6EXT.OLB复制到VBA7,VBA7里的VBE7.DLL复制到VBA6,再次打开office就不会出现了

    VBE7.DLL所在目录:C:\Program Files\Common Files\microsoft shared\VBA\VBA7(可能会有差异,如果是VBA7.1,则是7.1)
    VBE6EXT.OLB所在目录: C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA6,复制过来粘贴即可

你可能感兴趣的:(数据分析)