在Python中递归列出FTP目录

3 投票
2 回答
4934 浏览
提问于 2025-04-17 09:14

我在远程FTP网站上获取目录列表时遇到了困难。这个回答对我没用(我没有任何输出,程序似乎卡住了)。

这是我能想到的最简单的实现方式——它应该能打印出找到的每个目录的完整路径:

import ftplib

def ftp_walk(ftp):    
print 'Path:', ftp.pwd()
    dirs = ftp.nlst()
    for item in (path for path in dirs if path not in ('.', '..')):
        try:
            ftp.cwd(item)
            print 'Changed to', ftp.pwd()
            ftp_walk(ftp)
            ftp.cwd('..')
        except Exception, e:
            print item, e

ftp = ftplib.FTP('ftp.site.com')                                        
ftp.login('user', 'pass')
ftp.cwd('1')
ftp_walk(ftp)

我的目录结构是:

1/
 1-1/
   1-2/
 1-2/
 1-3/
 1-4

但是,它只输出了以下内容。这表明工作目录只改变了一次,进入了一个新的子目录,但当用新的当前工作目录调用ftp_walk()时,它没有继续往下走:

> Path: 1/
> Changed to 1-1/

2 个回答

0

在调用 ftp.login('user', 'pass') 之前,以及在构造函数之后,你需要先调用 ftp.connect()

0

我想你登录的用户应该有权限访问所有这些结构,否则系统会报错,并且不会列出那个特定的目录。

如果你遇到了异常,请把它放在这里。也许你应该用 try..finally 来处理你的当前工作目录,这样它就不会丢失。可以建议你这样做:

    try:
        ftp.cwd(item)
        print 'Changed to', ftp.pwd()
        try:
            ftp_walk(ftp)
        finally:
            ftp.cwd('..')
    except ftplib.error_perm, e:
        print item, e

撰写回答