在python下载和使用xls文件的问题

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

数据来自url http://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 '\r\n\r\n<htm' 

这告诉我,该文件不是作为一个真正的xls文件下载。 我可以在Excel中打开文件,并且不会popup警告或兼容性错误。 奇怪的是,如果我然后保存该文件(在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方式呈现的数据,尽pipe名称为.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