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


2 Answers

解析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将提供一个特定的方法来执行此操作:

Question

您可以使用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服务器可能对这个列表进行格式化的所有不同方式。

有一种可移植的方式来获得一个数组填充目录列表?

(数组只能有文件夹名称。)




我碰巧遇到了似乎不支持MLSD的FTP服务器(Rackspace Cloud Sites虚拟服务器)。 然而,我需要几个字段的文件信息,如大小和时间戳,不只是文件名,所以我必须使用DIR命令。 在这台服务器上,DIR的输出看起来非常像OP。 如果它帮助任何人,这是一个小的Python类,解析一行这样的输出,以获得文件名,大小和时间戳。

导入日期时间

class FtpDir:
    def parse_dir_line(self, line):
        words = line.split()
        self.filename = words[8]
        self.size = int(words[4])
        t = words[7].split(':')
        ts = words[5] + '-' + words[6] + '-' + datetime.datetime.now().strftime('%Y') + ' ' + t[0] + ':' + t[1]
        self.timestamp = datetime.datetime.strptime(ts, '%b-%d-%Y %H:%M')

我知道,不是很便携,但容易扩展或修改处理各种不同的FTP服务器。




这帮助了我的代码。

当我试图只恶化一种类型的文件,并在屏幕上显示他们添加一个条件,在每一行的测试。

喜欢这个

elif command == 'ls':
    print("directory of ", ftp.pwd())
    data = []
    ftp.dir(data.append)

    for line in data:
        x = line.split(".")
        formats=["gz", "zip", "rar", "tar", "bz2", "xz"]
        if x[-1] in formats:
            print ("-", line)



Related