我在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 =列表(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
答案 0 :(得分:3)
生成器不会将整个结果保留在内存中。当被要求使用next
函数时,将生成结果。要将值作为列表获取,请使用带有list
的{{1}}函数,该函数将在内部调用生成器对象上的link.mlsd()
。
只需更改
next
到
t=link.mlsd()
答案 1 :(得分:1)
谁运行FTP主机? 500 MLSD not understood
表示他们不支持MLSD命令。这是FTP命令集的后续扩展,因此它们刚刚过时。规范在这里:
http://tools.ietf.org/html/rfc3659
除非他们升级到&#34;现代&#34; FTP版本,继续使用nlst()
。