Python ftp仅列出目录而不是文件

时间:2011-05-29 16:49:13

标签: python list ftp directory cwd

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

  1. 有没有办法从方法ftp.cwd获取返回值?
  2. 是否有办法首先获取目录名称,或者有更好的方法来做我想要的。
  3. 以下是我现在使用的代码:

        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 个答案:

答案 0 :(得分:5)

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

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

或者您可能想要解析目录列表中的输出。但这不是平台独立的,因为目录列表因操作系统而异。 如图所示here...

答案 1 :(得分:2)

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

ftp.nlst和ftp.dir是“从版本3.3开始不推荐使用:改为使用mlsd()。”

答案 2 :(得分: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/']

答案 3 :(得分: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