You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python ftplib使用问题:子目录文件下载与Zip文件解码错误

Python FTP下载问题解决方案

问题1:下载FTP子目录中的文件

有两种简单的实现方式:

方法1:先切换到目标子目录

使用ftp_server.cwd()方法切换到目标子目录,再执行下载操作:

import ftplib

HOSTNAME = "xxx"
USERNAME = "xxx"
PASSWORD = "xxx"

ftp_server = ftplib.FTP(HOSTNAME, USERNAME, PASSWORD)
ftp_server.encoding = "utf-8"

# 切换到指定子目录,示例路径为"docs/subfolder"
ftp_server.cwd("docs/subfolder")

filename = "gfg.txt"
with open(filename, "wb") as file:
    ftp_server.retrbinary(f"RETR {filename}", file.write)

ftp_server.dir()
ftp_server.quit()

方法2:直接指定文件完整路径

无需切换目录,直接在RETR命令中传入文件的完整路径:

import ftplib

HOSTNAME = "xxx"
USERNAME = "xxx"
PASSWORD = "xxx"

ftp_server = ftplib.FTP(HOSTNAME, USERNAME, PASSWORD)
ftp_server.encoding = "utf-8"

# 直接指定子目录下的文件完整路径
file_path = "docs/subfolder/gfg.txt"
# 提取文件名用于本地保存
filename = file_path.split("/")[-1]

with open(filename, "wb") as file:
    ftp_server.retrbinary(f"RETR {file_path}", file.write)

ftp_server.dir()
ftp_server.quit()

问题2:下载Zip文件时出现UnicodeDecodeError

错误根源是你用**文本模式("r")**尝试读取二进制格式的Zip文件。Zip属于二进制文件,不能用文本编码解析。

修改方案(去掉无效的文本读取逻辑)

import ftplib

HOSTNAME = "xxx"
USERNAME = "xxx"
PASSWORD = "xxx"

ftp_server = ftplib.FTP(HOSTNAME, USERNAME, PASSWORD)
ftp_server.encoding = "utf-8"

filename = "archive.zip"

with open(filename, "wb") as file:
    ftp_server.retrbinary(f"RETR {filename}", file.write)

ftp_server.dir()
ftp_server.quit()

如果需要解压Zip文件的示例

import ftplib
import zipfile

HOSTNAME = "xxx"
USERNAME = "xxx"
PASSWORD = "xxx"

ftp_server = ftplib.FTP(HOSTNAME, USERNAME, PASSWORD)
ftp_server.encoding = "utf-8"

filename = "archive.zip"

with open(filename, "wb") as file:
    ftp_server.retrbinary(f"RETR {filename}", file.write)

# 解压到指定目录
with zipfile.ZipFile(filename, 'r') as zip_ref:
    zip_ref.extractall("extracted_files")

ftp_server.dir()
ftp_server.quit()

内容的提问来源于stack exchange,提问作者alex1290

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 06:40:37