在Python中递归列出FTP目录

在Python中递归列出FTP目录,python,ftp,directory-structure,Python,Ftp,Directory Structure,检索远程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站点上的目录列表时遇到困难。答案不起作用(我没有得到任何输出,它似乎挂起)

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

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
但是,它只输出以下内容。它建议将工作目录更改一次为新的子目录,但当使用新的cwd调用ftp_walk()时,不会再进一步:

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

我假设您登录的用户可以访问所有这些结构,否则它将返回一个错误,并且不会列出特定的目录

如果您遇到异常,请将其放在这里。也许你应该试试……最后,你的cwd,这样它就不会丢失了。我可以建议:

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

ftp.login('user','pass')
之前和构造函数之后,需要调用
ftp.connect()

它挂起在哪个函数中?(您可以在代码中添加一些打印语句以查看它发生的位置)此外,您的代码在尝试cwd到某个条目之前不会检查该条目是否为目录。谢谢,我已经编辑了我的问题。我不知道有一种称为
元组理解
。第4行的陈述是什么?Eknath-好问题;这是我的一个错误。但是,它会产生与列表理解相同的输出。谢谢您的建议。我找了你的钱,但它仍然挂在同一个地方。我对FTP上的目录做了一些轻微的更改,看起来好像它只挂在不包含子目录的目录上。我不确定这意味着什么,如果有的话。我最近遇到了这个悬而未决的问题,除了网络特权(防火墙等)外,我无法找出是什么原因造成的。无论如何,打开/关闭被动模式是一种解决办法。