import pandas as pd
url_all = "https://sc.hkex.com.hk/TuniS/www.hkex.com.hk/chi/services/trading/securities/securitieslists/ListOfSecurities_c.xlsx"
stocks = pd.read_excel(url_all,skiprows=2,dtype=str)
很简单的代码,下载网页资源,读取成一个数据框。
总是有错误
File "<stdin>", line 1, in <module>
File "/usr/local/lib64/python3.6/site-packages/pandas/util/_decorators.py", line 208, in wrapper
return func(*args, **kwargs)
File "/usr/local/lib64/python3.6/site-packages/pandas/io/excel/_base.py", line 310, in read_excel
io = ExcelFile(io, engine=engine)
File "/usr/local/lib64/python3.6/site-packages/pandas/io/excel/_base.py", line 819, in __init__
self._reader = self._engines[engine](self._io)
File "/usr/local/lib64/python3.6/site-packages/pandas/io/excel/_xlrd.py", line 21, in __init__
super().__init__(filepath_or_buffer)
File "/usr/local/lib64/python3.6/site-packages/pandas/io/excel/_base.py", line 348, in __init__
filepath_or_buffer = BytesIO(urlopen(filepath_or_buffer).read())
File "/usr/lib64/python3.6/http/client.py", line 472, in read
s = self._safe_read(self.length)
File "/usr/lib64/python3.6/http/client.py", line 622, in _safe_read
chunk = self.fp.read(min(amt, MAXAMOUNT))
File "/usr/lib64/python3.6/socket.py", line 586, in readinto
return self._sock.recv_into(b)
File "/usr/lib64/python3.6/ssl.py", line 968, in recv_into
return self.read(nbytes, buffer)
File "/usr/lib64/python3.6/ssl.py", line 830, in read
return self._sslobj.read(len, buffer)
File "/usr/lib64/python3.6/ssl.py", line 587, in read
v = self._sslobj.read(len, buffer)
请问,如何解决?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
这个错误信息表明在尝试使用pandas.read_excel()函数从URL直接读取Excel文件时遇到了问题,很可能是由于SSL连接或数据读取过程中出现了异常。考虑到你可能在一个受限的环境中执行此操作(如无界面服务器或特定Python环境),以下是一些建议来解决这个问题:
更新库: 确保你的pandas, openpyxl, xlrd等相关库是最新版本。有时候,库的更新会修复之前存在的问题。你可以通过运行以下命令来更新它们:
pip install pandas --upgrade
pip install openpyxl --upgrade # 如果你处理的是.xlsx文件
pip install xlrd --upgrade # 对于.xls文件,但注意xlrd 2.0后不再支持.xlsx
手动下载并读取: 如果上述方法不奏效,可以尝试手动下载Excel文件到本地,然后通过本地路径读取文件。这样可以避免网络和SSL连接的问题。
import pandas as pd
# 假设你已经将文件下载到了'./ListOfSecurities_c.xlsx'
local_file_path = "./ListOfSecurities_c.xlsx"
stocks = pd.read_excel(local_file_path, skiprows=2, dtype=str)
使用requests库: 直接使用requests库来获取URL的内容,然后传递给pandas。这提供了更多的控制权来处理HTTP请求和响应。
import pandas as pd
import requests
from io import BytesIO
url_all = "https://sc.hkex.com.hk/TuniS/www.hkex.com.hk/chi/services/trading/securities/securitieslists/ListOfSecurities_c.xlsx"
response = requests.get(url_all)
response.raise_for_status() # 检查请求是否成功
stocks = pd.read_excel(BytesIO(response.content), skiprows=2, dtype=str)
这段代码首先发送一个GET请求到指定的URL,然后确保请求成功(没有HTTP错误),最后使用返回的内容创建一个BytesIO对象,该对象被pandas.read_excel()方法接受。
检查网络配置: 如果是在企业内网或有特殊网络限制的环境下,可能需要检查防火墙设置或代理配置,确保能够顺利访问外部资源。
SSL证书问题: 如果问题是由于SSL证书验证失败导致的,你可以在使用requests时禁用SSL验证,但这不是一个安全的做法,仅作为调试手段:
response = requests.get(url_all, verify=False)
请谨慎使用verify=False,因为它会使你的请求容易受到中间人攻击。
尝试上述建议中的一个或几个,希望能帮助你解决问题。