使用urllib3下载公开FTP文件时出现KeyError: 'ftp'错误,如何解决?
使用urllib3下载FTP文件遇到KeyError: 'ftp'的解决方案
嘿,我看到你用urllib3下载公开FTP服务器文件时碰到了KeyError: 'ftp'的问题,这其实是个常见小坑——urllib3本身并不支持FTP协议,它的核心能力是处理HTTP/HTTPS请求,所以碰到ftp://开头的URL时,就会因为识别不了协议抛出这个错误。
给你两种简单靠谱的解决方法,任选其一就行:
方法一:用Python标准库ftplib(专门处理FTP)
ftplib是Python自带的FTP操作库,功能完善,适合需要精细控制FTP操作的场景,针对这个匿名FTP服务器的下载代码如下:
from ftplib import FTP import os # 配置信息 ftp_server = "ftp2.datasus.gov.br" # 去掉URL开头的ftp:// remote_file = "/pub/sistemas/tup/downloads/TabelaUnificada_200802.zip" local_file = "./TabelaUnificada_200802.zip" # 连接并下载 with FTP(ftp_server) as ftp: ftp.login() # 匿名登录,无需用户名密码 with open(local_file, 'wb') as f: ftp.retrbinary(f"RETR {remote_file}", f.write) print("文件下载完成!")
如果遇到需要用户名密码的FTP服务器,只需要给ftp.login()传对应参数:ftp.login("你的用户名", "你的密码")即可。
方法二:用urllib.request(支持多协议的标准库)
如果你习惯urllib系列的用法,urllib.request是更好的选择,它支持FTP、HTTP等多种协议,代码更简洁:
import urllib.request ftp_url = 'ftp://ftp2.datasus.gov.br/pub/sistemas/tup/downloads/TabelaUnificada_200802.zip' save_path = "./TabelaUnificada_200802.zip" # 一行代码完成下载保存 urllib.request.urlretrieve(ftp_url, save_path) print("文件下载完成!")
这个方法会自动处理匿名登录逻辑,非常省心。
最后补充一句:urllib3的PoolManager只针对HTTP/HTTPS协议做了适配,碰到ftp协议触发KeyError是它的设计预期,并不是bug哦。
内容的提问来源于stack exchange,提问作者Clayton Tosatti
相关产品推荐
相关产品推荐

