【问题标题】:Python ftp list only directories and not filesPython ftp 仅列出目录而不列出文件
【发布时间】:2023-09-15 09:57:01
【问题描述】:

我想列出 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('../')

【问题讨论】:

    标签: python list ftp directory cwd


    【解决方案1】:

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

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

    否则您可能想要解析目录列表的输出。不过,这不会与平台无关,因为目录列表因操作系统而异。 如图here...

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这与使用的 Python 版本无关,nlst 非常活跃。 mlsd可以使用当FTP服务器支持 RFC 3659;许多服务器并非如此。
      【解决方案3】:

      这有点难看,但是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/']
      

      【讨论】:

        【解决方案4】:

        这对我有用:

        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 
        

        【讨论】: