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

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

在新机器上使用 seaborn 模块绘制热图的时候,出现报错

在尝试使用 seaborn 模块绘制热图的时候,先是报错:
urllib.error.URLError: <urlopen error [Errno 11004] getaddrinfo failed>,

在尝试了 这篇文章 的方法修改DNS后,报错 信息变为:
urllib.error.URLError: <urlopen error [WinError 10054] 远程主机强迫关闭了一个现有的连接。>

处理方法在文章底部,这里是探索过程

定位错误信息

我的报错信息为:

Traceback (most recent call last):
  File "E:/Python/test_ksh.py", line 4, in <module>
    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: <urlopen error [WinError 10054] 远程主机强迫关闭了一个现有的连接。>

从报错信息中可以看出,主要是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_path


    df = 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).

好家伙!这里提到是在 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()

运行结果

完美解决!!!

总结

访问 https://github.com/mwaskom/seaborn-data ,打包下载,复制到如下路径(没有就新建)

C:\Users\Administrator\seaborn-data\

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页