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

Python中ftp.retrlines()命令构建及文件下载位置问题

解决FTP批量下载的命令构建与文件保存问题

一、命令构建错误的原因与解决方法

你用ftp.dir()获取文件列表后构建RETR命令报错,核心问题是:

  • ftp.dir()返回的是完整目录详情字符串(包含权限、文件大小、修改日期、文件名等),不是纯文件名。直接把这些字符串拼到RETR命令里,会变成RETR -rw-r--r-- 1 ftpuser ftpgroup 4096 Jun 15 09:30 test.txt这种非法格式,自然报错。

正确的文件名获取方式是用ftp.nlst():

  • 该方法返回目录下的纯文件名/子目录名列表,直接用来构建RETR命令即可。如果需要过滤掉子目录,可额外判断:
# 获取当前FTP目录下的所有项
all_items = ftp.nlst()
# 过滤掉子目录,只保留文件(可选)
file_list = []
for item in all_items:
    try:
        # 尝试切换到该项,如果失败则是文件
        ftp.cwd(item)
        ftp.cwd('..')  # 切回原目录
    except:
        file_list.append(item)

二、下载文件找不到的原因与解决方法

用固定文件名执行ftp.retrlines()无报错但本地找不到文件,是因为**retrlines()默认只把文件内容输出到控制台,不会写入本地文件**。

要保存文件到本地,有两种正确方式:

方式1:用ftp.retrbinary()(推荐,支持所有文件类型)

二进制模式下载,配合本地文件写入:

import os
from ftplib import FTP

# 初始化FTP连接
ftp = FTP('你的FTP服务器地址')
ftp.login('用户名', '密码')
ftp.cwd('/目标FTP目录')  # 切换到要下载的目录

# 创建本地保存目录(不存在则自动创建)
local_save_dir = './ftp_downloads'
os.makedirs(local_save_dir, exist_ok=True)

# 获取纯文件名列表
file_list = ftp.nlst()
# 过滤子目录(可选)
file_list = [f for f in file_list if not ftp.nlst(f)]

# 循环下载每个文件
for filename in file_list:
    # 构建本地文件路径,处理文件名可能的换行/空格
    local_file_path = os.path.join(local_save_dir, filename.strip())
    # 打开本地文件并写入
    with open(local_file_path, 'wb') as local_file:
        ftp.retrbinary(f'RETR {filename}', local_file.write)
    print(f'文件已保存到:{local_file_path}')

ftp.quit()

方式2:给retrlines()传自定义回调函数

如果是文本文件,也可以通过回调函数把每行内容写入本地文件:

def write_to_file(line, file_obj):
    # 将文本行编码后写入文件,添加换行符
    file_obj.write(line.encode('utf-8') + b'\n')

with open(local_file_path, 'wb') as local_file:
    ftp.retrlines(f'RETR {filename}', lambda line: write_to_file(line, local_file))

三、额外注意事项

  • 确保本地保存目录的权限足够,避免因权限问题导致文件写入失败但无报错。
  • 如果文件名包含特殊字符(如中文、空格),确保FTP连接和本地文件系统的编码一致(比如用utf-8)。
  • 下载前可通过ftp.size(filename)检查文件大小,验证是否下载完整。

内容的提问来源于stack exchange,提问作者W. Wang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:57:21