在python中下载和使用xls文件时出现问题



我正试图使用urllib和xlrd下载并操作一个xls文件。

数据来自urlhttp://profiles.doe.mass.edu/search/search_export.aspx?orgCode=&orgType=5,12&runOrgSearch=Y&searchType=ORG&leftNavId=11238&showEmail=N

我使用的是Python 2.7、xlrd 0.9.4、urllib 1.17,我使用的也是Mac。

我能够使用此代码成功下载该文件。

saveLocation = home_dir+"/test/"
fileName = "data.xls"
page = <the url given above>
urllib.urlretrieve(page, saveLocation+fileName)

然后我尝试使用xlrd 打开文件

wb = xlrd.open_workbook(saveLocation+fileName)

但是得到错误

XLRDError: Unsupported format, or corrupt file: Expected BOF record; found 'rnrn<htm' 

这告诉我该文件不是作为真正的xls文件下载的。我可以在Excel中打开文件,不会收到弹出警告或兼容性错误。奇怪的是,如果我将文件(在Excel中)保存为Excel 97-2004,xlrd错误就会消失。因此,Excel似乎"修复"了文件中的任何错误。

所以我的问题是,我如何在python中"修复"文件,或者以xlrd可以识别的适当格式下载数据?

我也尝试过将该文件下载为xlsx文件并使用openpyxl,但也出现了类似的错误。openpyxl表示这不是一个有效的zip文件。我还尝试过使用不同的方法下载数据,比如请求。

谢谢。

编辑:使用@DSM提供的信息,我可以下载并使用Excel文件。这是我用过的密码。

dfs = pd.read_html(fileLocation+fileName, index_col = 7, header=0)[0]
writer = pd.ExcelWriter(fileLocation+fileName)
dfs.to_excel(writer,"Sheet1")
writer.save()

然后我就可以访问文件作为一个真正的Excel文件

ws = pd.read_excel(fileLocation+fileName, 0) 

正如<htm位应该提示的那样,这实际上是以xml方式呈现的数据,尽管名称为.xls。(在您最喜欢的编辑器中手动查看数据头几乎总是值得的,当它很难读取时,可以查看它到底是什么。)有时这可能是一个真正的麻烦,但幸运的是,在这里我们可以简单地使用read_html:来读取它

>>> url="http://profiles.doe.mass.edu/search/search_export.aspx?orgCode=&orgType=5,12&runOrgSearch=Y&searchType=ORG&leftNavId=11238&showEmail=N"
>>> dfs = pd.read_html(url)
>>> len(dfs)
1
>>> dfs[0].iloc[:5,:5]
                                                   0         1  
0                                           Org Name  Org Code   
1       Abby Kelley Foster Charter Public (District)  04450000   
2                                           Abington  00010000   
3  Academy Of the Pacific Rim Charter Public (Dis...  04120000   
4                                     Acton (non-op)  00020000   
                        2                      3              4  
0                Org Type               Function   Contact Name  
1        Charter District  Charter School Leader     Brian Haas  
2  Public School District         Superintendent  Peter Schafer  
3        Charter District  Charter School Leader  Chris Collins  
4  Public School District         Superintendent    Glenn Brand  

更仔细地看,我们可以使用第0行作为标题,因此:

>>> df = pd.read_html(url, header=0)[0]
>>> df.iloc[:5, :5]
                                            Org Name  Org Code  
0       Abby Kelley Foster Charter Public (District)   4450000   
1                                           Abington     10000   
2  Academy Of the Pacific Rim Charter Public (Dis...   4120000   
3                                     Acton (non-op)     20000   
4                                   Acton-Boxborough   6000000   
                 Org Type               Function   Contact Name  
0        Charter District  Charter School Leader     Brian Haas  
1  Public School District         Superintendent  Peter Schafer  
2        Charter District  Charter School Leader  Chris Collins  
3  Public School District         Superintendent    Glenn Brand  
4  Public School District         Superintendent    Glenn Brand  

最新更新