ftputil 默认不将空用户名自动转换为 'anonymous',而 ftplib 会自动处理,因此直接传入空字符串会导致 530 登录失败;需显式指定 user='anonymous' 才能成功建立匿名连接。
ftputil 是一个功能丰富的 Python FTP 客户端封装库,提供了类似本地文件系统的接口(如 mkdir, chmod, walk 等),但其登录逻辑比原生 ftplib 更严格:它不会对空用户名('')做隐式转换。而 ftplib.FTP(host, user, pw) 在 user 为空时,内部会自动将其替换为 'anonymous',并通常以 'anonymous@' 作为密码(或空密码)完成匿名登录——这正是访问 ftp.swpc.noaa.gov 等公共 FTP 服务器的标准方式。
因此,要让 ftputil.FTPHost 正常工作,必须显式传入 user='anonymous'(密码可为空或 'anonymous@',具体取决于服务器策略)。以下是推荐的写法:
import ftputil
host = 'ftp.swpc.noaa.gov'
user = 'anonymous'
pw = '' # 多数匿名 FTP 服务器接受空密码
with ftputil.FTPHost(host, user, pw) as ftphost:
print("Connected successfully!")
print("Root directory contents:", ftphost.listdir(ftphost.curdir))✅ 输出示例:
Connected successfully! Root directory contents: ['pub']
⚠️ 注意事项:

总结:ftputil 的设计强调显式优于隐式,虽然牺牲了一点向后兼容性,但提升了行为可预测性。只需将空用户改为 'anonymous',即可无缝迁移 ftplib 项目并享受 ftputil 提供的高级文件操作能力。