您可以使用ftplib在Python中提供完整的FTP支持.但是,获取目录列表的首选方法是:
# File: ftplib-example-1.py import ftplib ftp = ftplib.FTP("www.python.org") ftp.login("anonymous", "ftplib-example-1") data = [] ftp.dir(data.append) ftp.quit() for line in data: print "-", line
产量:
$ python ftplib-example-1.py - total 34 - drwxrwxr-x 11 root 4127 512 Sep 14 14:18 . - drwxrwxr-x 11 root 4127 512 Sep 14 14:18 .. - drwxrwxr-x 2 root 4127 512 Sep 13 15:18 RCS - lrwxrwxrwx 1 root bin 11 Jun 29 14:34 README -> welcome.msg - drwxr-xr-x 3 root wheel 512 May 19 1998 bin - drwxr-sr-x 3 root 1400 512 Jun 9 1997 dev - drwxrwxr-- 2 root 4127 512 Feb 8 1998 dup - drwxr-xr-x 3 root wheel 512 May 19 1998 etc ...
我想这个想法是解析结果以获得目录列表.但是,此列表直接取决于FTP服务器格式化列表的方式.为此编写代码将不得不预测FTP服务器可能格式化此列表的所有不同方式,这将是非常混乱的.
是否有一种可移植的方式来获取填充目录列表的数组?
(该数组应该只有文件夹名称.)
尝试使用ftp.nlst(dir)
.
但请注意,如果文件夹为空,则可能会引发错误:
files = [] try: files = ftp.nlst() except ftplib.error_perm, resp: if str(resp) == "550 No files found": print "No files in this directory" else: raise for f in files: print f
解析FTP目录列表的可靠/标准化方法是使用MLSD命令,现在所有最近/体面的FTP服务器都应支持该命令.
import ftplib f = ftplib.FTP() f.connect("localhost") f.login() ls = [] f.retrlines('MLSD', ls.append) for entry in ls: print entry
上面的代码将打印:
modify=20110723201710;perm=el;size=4096;type=dir;unique=807g4e5a5; tests modify=20111206092323;perm=el;size=4096;type=dir;unique=807g1008e0; .xchat2 modify=20111022125631;perm=el;size=4096;type=dir;unique=807g10001a; .gconfd modify=20110808185618;perm=el;size=4096;type=dir;unique=807g160f9a; .skychart ...
从python 3.3开始,ftplib将提供一个特定的方法来执行此操作:
http://bugs.python.org/issue11072
http://hg.python.org/cpython/file/67053b135ed9/Lib/ftplib.py#l535