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

and*_*wrk 54 python ftp portability

您可以使用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
Run Code Online (Sandbox Code Playgroud)

产量:

$ 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
...
Run Code Online (Sandbox Code Playgroud)

我想这个想法是解析结果以获得目录列表.但是,此列表直接取决于FTP服务器格式化列表的方式.为此编写代码将不得不预测FTP服务器可能格式化此列表的所有不同方式,这将是非常混乱的.

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

(该数组应该只有文件夹名称.)

Wil*_*ler 118

尝试使用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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你.5年后:从版本3.3开始不推荐使用:改为使用mlsd(). (14认同)
  • 是的,这回答了这个问题,我认为这很好,但这完全不是一个可扩展的答案.如果我需要一个带属性的文件对象怎么办?不要悲观,但它会很方便. (4认同)
  • 即使在今天,许多 ftp 服务器也不支持 `MLSD` 命令。 (3认同)
  • 哦,很好地发现了550!Upvoted.:) (2认同)

Gia*_*olà 25

解析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
Run Code Online (Sandbox Code Playgroud)

上面的代码将打印:

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
...
Run Code Online (Sandbox Code Playgroud)

从python 3.3开始,ftplib将提供一个特定的方法来执行此操作:


chi*_*ner 6

我在尝试获取文件名、上次修改的图章、文件大小等时找到了我的方法,并想添加我的代码。编写一个循环来解析ftp.dir(dir_list.append)使用 python std lib 之类的东西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']
Run Code Online (Sandbox Code Playgroud)