Python FTP仅列出目录,不列出文件

5 投票
4 回答
10967 浏览
提问于 2025-04-16 18:34

我想列出一个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 个回答

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/']
2

这里有一个适用于Python 3.3的解决方案(mlsd):http://docs.python.org/3/library/ftplib.html#ftplib.FTP.mlsd

ftp.nlst和ftp.dir这两个方法在3.3版本中已经被弃用了:建议使用mlsd()方法来代替。

6

FTP协议并没有办法区分目录和文件(在列出时)。我觉得最好的办法就是尝试一下,如果失败了就算了。

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

或者,你也可以尝试解析目录列表的输出。不过这样做就不太能跨平台了,因为不同的操作系统目录列表的格式是不同的。就像这里所示的那样……

撰写回答