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

时间:2020-03-06 14:30:52  来源:igfitidea点击:

我们可以使用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

LIST响应的布局没有标准。我们必须编写代码来处理最流行的布局。我将从Linuxls和Windows ServerDIR格式开始。但是,那里有很多变化。

如果我们无法解析较长的列表,请退回到nlst方法(返回NLST命令的结果)。要获得加分,请作弊:包含已知文件名的行中最长的数字可能是其长度。