0

我在 Python 3.3 中有以下代码:

ftpHost="myhost"
link=ftplib.FTP(ftpHost)
link.login(user="me",passwd="alsome")
t=link.nlst()
link.quit()
print(t)

我得到的输出是

['.','..','dir1','dir2']

在 Python 3 文档中,写到 FTP.nlst “自 3.3 版以来已弃用:改用 mlsd()”。当我尝试

ftpHost="myhost"
link=ftplib.FTP(ftpHost)
link.login(user="me",passwd="alsome")
t=link.mlsd()
link.quit()
print(t)

我得到的输出是

<generator object mlsd at 0x0000000002A0F120>

这不是想要的答案。我不知道在哪里可以得到目录列表。如何使用 mlsd 获取目录列表?

如果我尝试@fourtheye 的建议并更改为 t=list(link.mlsd)

我得到的错误是

Traceback (most recent call last):
  File "C:/xyz/python-test/python-test.py", line 17, in <module>
    main()
  File "C:/xyz/python-test/python-test.py", line 12, in main
    t=list(link.mlsd())
  File "C:\WinPython-64bit-3.3.2.1\python-3.3.2.amd64\lib\ftplib.py", line 556, in mlsd
    self.retrlines(cmd, lines.append)
  File "C:\WinPython-64bit-3.3.2.1\python-3.3.2.amd64\lib\ftplib.py", line 446, in retrlines
    with self.transfercmd(cmd) as conn, \
  File "C:\WinPython-64bit-3.3.2.1\python-3.3.2.amd64\lib\ftplib.py", line 386, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
  File "C:\WinPython-64bit-3.3.2.1\python-3.3.2.amd64\lib\ftplib.py", line 352, in ntransfercmd
    resp = self.sendcmd(cmd)
  File "C:\WinPython-64bit-3.3.2.1\python-3.3.2.amd64\lib\ftplib.py", line 259, in sendcmd
    return self.getresp()
  File "C:\WinPython-64bit-3.3.2.1\python-3.3.2.amd64\lib\ftplib.py", line 233, in getresp
    raise error_perm(resp)
ftplib.error_perm: 500 MLSD not understood
4

2 回答 2

3

生成器不会将整个结果保存在内存中。结果将在被要求时生成,具有next功能。为了将值作为列表获取,请使用listwith 函数link.mlsd(),该函数将在内部调用next生成器对象。

只是改变

t=link.mlsd()

t=list(link.mlsd())
于 2013-11-11T01:24:19.913 回答
1

谁运行 FTP 主机?这500 MLSD not understood意味着他们不支持 MLSD 命令。这是 FTP 命令集的后期扩展,所以它们已经过时了。规范在这里:

https://www.rfc-editor.org/rfc/rfc3659

除非并且直到他们升级到“现代”版本的 FTP,否则请继续使用nlst().

于 2013-11-11T01:50:13.227 回答