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【Debug生涯|seaborn urllib.error.URLError: < urlopen error [WinError 10054] 远程主机强迫关闭了一个现有的连接。>】好家伙!这里提到是在 https://github.com/mwaskom/seaborn-data 获取的联机数据,而下边是在 https://raw.githubusercontent.com/mwaskom/seaborn-data/master/ 获取数据!!!
Name of the dataset ({name}.csv
on
https://github.com/mwaskom/seaborn-data).
虽然不知道为啥搞俩地方,但虽然下边的上不去 可是我大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\
推荐阅读
- python|使用python-Django创建Web站点
- 数学建模的知识|数学建模 层次分析法 python计算权重
- anaconda|anaconda和ts
- #|Python剑指offer打卡-4
- eNSP|eNSP中玩转Python自动化——通过FTP备份交换机配置文件
- pandas|第八章 文本数据
- Python进阶|python中的deque模块(collections的deque模块)
- 机器学习|sklearn机器学习——day11
- python 上机实验 字符串