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

标签 python excel urllib xls xlrd

我正在尝试使用 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 中打开该文件,并且不会收到弹出警告或兼容性错误。 奇怪的是,如果我随后将文件(在 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 。 (当数据难以阅读时,几乎总是值得在您最喜欢的编辑器中手动查看数据 header ,以检查其实际内容。)有时这可能确实很麻烦,但幸运的是,我们可以在这里只需使用 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  

关于python - 在python中下载和使用xls文件时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33486700/

相关文章:

python - 在特定键值处开始字典 for 循环

excel - 如何显示(或防止隐藏)从 PowerShell 创建的 Excel 工作表

python - 如何在python中从url获取文件?

python - 如何使用 Python 从远程文本文件中检索最后一个字符?

python - 如何有效地定义每日常量?

python - 如何杀死子进程

Python 多进程队列 get() block

c# - 学习 c# Excel 互操作的资源

vba - 创建到另一个单元格的超链接

python - urllib 和 "SSL: CERTIFICATE_VERIFY_FAILED"错误