使用Python的ftplib获取可移植目录列表

76 投票
7 回答
154137 浏览
提问于 2025-04-11 09:23

你可以使用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服务器可能使用的各种格式,写代码会变得非常麻烦。

有没有一种通用的方法可以得到一个只包含文件夹名称的数组呢?

7 个回答

10

我在寻找文件名、最后修改时间、文件大小等信息时,找到了这里,并想分享我的代码。写一个循环来解析 ftp.dir(dir_list.append) 只花了我几分钟。我用了Python标准库的一些功能,比如 strip()(用来清理文本行)和 split() 来创建一个数组。

ftp = FTP('sick.domain.bro')
ftp.login()
ftp.cwd('path/to/data')

dir_list = []
ftp.dir(dir_list.append)

# main thing is identifing which char marks start of good stuff
# '-rw-r--r--   1 ppsrt    ppsrt      545498 Jul 23 12:07 FILENAME.FOO
#                               ^  (that is line[29])

for line in dir_list:
   print line[29:].strip().split(' ') # got yerself an array there bud!
   # EX ['545498', 'Jul', '23', '12:07', 'FILENAME.FOO']
35

解析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库会提供一个专门的方法来实现这个功能:

149

试试用 ftp.nlst(dir) 这个方法。

不过要注意,如果文件夹是空的,可能会出现错误:

files = []

try:
    files = ftp.nlst()
except ftplib.error_perm as resp:
    if str(resp) == "550 No files found":
        print "No files in this directory"
    else:
        raise

for f in files:
    print f

撰写回答