uday
uday

Reputation: 6713

ftp directory in Python 3

I have the following code in Python 3.3:

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

The output I get is

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

In the Python 3 document, it is written that FTP.nlst has been "deprecated since version 3.3: use mlsd() instead". When I tried

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

The output I get is

<generator object mlsd at 0x0000000002A0F120>

which is not the desired answer. I can't figure out where within t can I get the directory listing. How can I use mlsd to get the directory listing?

If I try @fourtheye 's suggestion and change to t=list(link.mlsd)

the error I get is

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

Upvotes: 0

Views: 3404

Answers (2)

thefourtheye
thefourtheye

Reputation: 239473

Generators dont keep entire results in the memory. The results will be generated when asked for one, with next function. In order to get the values as a list, use the list function with link.mlsd(), which will internally call next on the generator object.

Just change

t=link.mlsd()

to

t=list(link.mlsd())

Upvotes: 3

Tim Peters
Tim Peters

Reputation: 70592

Who runs the FTP host? The 500 MLSD not understood means they don't support the MLSD command. That's a later extension to the FTP command set, so they're just out of date. The specification is here:

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

Unless and until they upgrade to a "modern" version of FTP, just continue to use nlst().

Upvotes: 1

Related Questions