5

我想列出 ftp 目录上的所有目录,然后输入每个目录。问题是我的代码还列出了文件并尝试输入它们。

  1. 有没有办法从方法 ftp.cwd 获取返回值?
  2. 有没有办法首先只获取目录名称,或者有更好的方法来做我想做的事。

这是我现在使用的代码:

    from ftplib import FTP
    ftp = FTP('ftp.overtherainbow.com')
    ftp.login()
    for name in ftp.nlst():
        print "listing: " + name
        ftp.cwd(name)
        ftp.retrlines('LIST')
        ftp.cwd('../')
4

4 回答 4

6

FTP 协议没有区分目录和文件的方法(如列表)。我认为最好的选择是尝试并失败

try:
    ftp.cwd(name)
except ftplib.error_perm as detail:
    print("It's probably not a directory:", detail)

或者,您可能想要解析目录列表的输出。不过,这不会与平台无关,因为目录列表因操作系统而异。如此处所示...

于 2011-05-29T17:42:59.327 回答
2

这是一个 Python 3.3 解决方案(mlsd): http ://docs.python.org/3/library/ftplib.html#ftplib.FTP.mlsd

ftp.nlst 和 ftp.dir 是“自 3.3 版以来已弃用:改用 mlsd()。”

于 2013-05-22T09:46:51.747 回答
1

这有点难看,但ftplib似乎不太好用。

>>> x=[]
>>> ftp.dir('-d','*/',lambda L:x.append(L.split()[-1]))
>>> x
['access-logs/', 'etc/', 'mail/', 'perl/', 'proxy/', 'public_ftp/', 'public_html/', 'subversion/', 'tmp/', 'web/', 'www/']
于 2011-05-29T18:07:41.203 回答
0

这对我有用:

def get_current_dir_subdirs(self):
    ret = []
    self.ftp.dir("",ret.append)
    ret = [x.split()[-1] for x in ret if x.startswith("d")]
    return ret 
于 2011-10-07T10:05:18.117 回答