Debug生涯|seaborn urllib.error.URLError: < urlopen error [WinError 10054] 远程主机强迫关闭了一个现有的连接。>


seaborn urllib.error.URLError: urlopen error [WinError 10054] 远程主机强迫关闭了一个现有的连接。

  • 在新机器上使用 seaborn 模块绘制热图的时候,出现报错
    • 处理方法在文章底部,这里是探索过程
    • 定位错误信息
    • 错误分析
    • 解决办法
  • 总结

在新机器上使用 seaborn 模块绘制热图的时候,出现报错 在尝试使用 seaborn 模块绘制热图的时候,先是报错:
urllib.error.URLError:
在尝试了 这篇文章 的方法修改DNS后,报错 信息变为:
urllib.error.URLError:
处理方法在文章底部,这里是探索过程 定位错误信息 我的报错信息为:
Traceback (most recent call last): File "E:/Python/test_ksh.py", line 4, in flights_long = sns.load_dataset("flights",cache=False) File "E:\Python\venv\lib\site-packages\seaborn\utils.py", line 492, in load_dataset df = pd.read_csv(full_path, **kws) File "E:\Python\venv\lib\site-packages\pandas\io\parsers.py", line 605, in read_csv return _read(filepath_or_buffer, kwds) File "E:\Python\venv\lib\site-packages\pandas\io\parsers.py", line 457, in _read parser = TextFileReader(filepath_or_buffer, **kwds) File "E:\Python\venv\lib\site-packages\pandas\io\parsers.py", line 814, in __init__ self._engine = self._make_engine(self.engine) File "E:\Python\venv\lib\site-packages\pandas\io\parsers.py", line 1045, in _make_engine return mapping[engine](self.f, **self.options)# type: ignore[call-arg] File "E:\Python\venv\lib\site-packages\pandas\io\parsers.py", line 1862, in __init__ self._open_handles(src, kwds) File "E:\Python\venv\lib\site-packages\pandas\io\parsers.py", line 1363, in _open_handles storage_options=kwds.get("storage_options", None), File "E:\Python\venv\lib\site-packages\pandas\io\common.py", line 563, in get_handle storage_options=storage_options, File "E:\Python\venv\lib\site-packages\pandas\io\common.py", line 288, in _get_filepath_or_buffer req = urlopen(filepath_or_buffer) File "E:\Python\venv\lib\site-packages\pandas\io\common.py", line 194, in urlopen return urllib.request.urlopen(*args, **kwargs) File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 222, in urlopen return opener.open(url, data, timeout) File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 525, in open response = self._open(req, data) File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 543, in _open '_open', req) File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 503, in _call_chain result = func(*args) File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 1360, in https_open context=self._context, check_hostname=self._check_hostname) File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 1319, in do_open raise URLError(err) urllib.error.URLError:

从报错信息中可以看出,主要是seaborn、pandas、request这三个库的问题。而pandas、request我又用过并没问题,推测问题主要是出现在seaborn模块的网络请求上(为啥不在安装库的时候顺手把配置文件弄上,咱也不知道,咱也不敢问)
我们点开报错信息第4行所在的位置 File File "E:\Python\venv\lib\site-packages\seaborn\utils.py", line 492, in load_dataset
我们来到这个位置观察这个函数,关于函数,在函数介绍里提到
Load an example dataset from the online repository (requires internet).>
翻译过来就是从联机存储库加载示例数据集(需要internet)。
也就是说问题出现在了从联机存储库加载示例数据集这里,可是前面已经修改DNS了,为何还会失败?
错误分析 我们来阅读这个函数,部分代码如下
path = ("https://raw.githubusercontent.com/" "mwaskom/seaborn-data/master/{}.csv") full_path = path.format(name)if cache: cache_path = os.path.join(get_data_home(data_home), os.path.basename(full_path)) if not os.path.exists(cache_path): if name not in get_dataset_names(): raise ValueError(f"'{name}' is not one of the example datasets.") urlretrieve(full_path, cache_path) full_path = cache_pathdf = pd.read_csv(full_path, **kws)

可以看到,我们联机的网址是
https://raw.githubusercontent.com/mwaskom/seaborn-data/master/{}.csv
这里的 {} 在下一步格式化为 name,而name就是我们在seaborn模块里通过 load_dataset 设置的绘制模式,或者说叫预设、主题什么的。我设置的是 name 是 “flights” ,所以,我获取预设的网址应该为:
https://raw.githubusercontent.com/mwaskom/seaborn-data/master/flights.csv
我尝试直接在浏览器里访问这个网址,很遗憾,访问失败,并且在尝试修改hosts等方法后无果。
再次阅读这个函数,发现在函数的解释说明里关于 name 参数有解释到
name : str
Name of the dataset ({name}.csv on
https://github.com/mwaskom/seaborn-data).
【Debug生涯|seaborn urllib.error.URLError: < urlopen error [WinError 10054] 远程主机强迫关闭了一个现有的连接。>】好家伙!这里提到是在 https://github.com/mwaskom/seaborn-data 获取的联机数据,而下边是在 https://raw.githubusercontent.com/mwaskom/seaborn-data/master/ 获取数据!!!
虽然不知道为啥搞俩地方,但虽然下边的上不去 可是我大Github 还是可以上的呀!,点开 https://github.com/mwaskom/seaborn-data ,一眼看到有一个叫"flights.csv"的文件躺在里面!!
(此处为弯路)那么,我将上面上不去的path,改写成path = ("https://github.com/mwaskom/seaborn-data/blob/master/{}.csv")岂不就是万事大吉了!很遗憾我有失败了(我们要的是csv文件,不是csv文件所在网页的html)
(此处为正道)再次梳理一下这个库函数
如果没有缓存(cache是 False),那么联机获取配置;
如果缓存 cache 是 True,那么从本地读取配置。
而我的问题出现在联机上,那么,我们可以直接在Github上把这些配置文件打包下载,放到本地,然后,就可以直接调用缓存了啊!!!
解决办法 访问 https://github.com/mwaskom/seaborn-data ,打包下载,复制到如下路径(没有就新建)
C:\Users\Administrator\seaborn-data\
将cache参数设置为True(默认就是True,也就是说不设置也行)
再次运行我们的代码(这段绘制热图的代码忘了从谁那复制粘贴的了,抱歉)
import matplotlib.pyplot as plt import seaborn as sns sns.set() flights_long = sns.load_dataset("flights") flights = flights_long.pivot("month", "year", "passengers") #绘制x-y-z的热力图,比如 年-月-销量 的热力图 f, ax = plt.subplots(figsize=(9, 6)) #使用不同的颜色 sns.heatmap(flights, fmt="d",cmap='YlGnBu', ax=ax) #设置坐标字体方向 label_y = ax.get_yticklabels() plt.setp(label_y, rotation=360, horizontalalignment='right') label_x = ax.get_xticklabels() plt.setp(label_x, rotation=45, horizontalalignment='right') plt.show()

Debug生涯|seaborn urllib.error.URLError: < urlopen error [WinError 10054] 远程主机强迫关闭了一个现有的连接。>
文章图片

完美解决!!!
总结 访问 https://github.com/mwaskom/seaborn-data ,打包下载,复制到如下路径(没有就新建)
C:\Users\Administrator\seaborn-data\

    推荐阅读