Bom dia galera, para quem gosta de brincar com novas versões de tudo deve ter notado o novo método de acesso da lib FTP do Python, foi introduzido o método mlsd() que faz o uso do comando MSLD do FTP (que na verdade, é bem mais antigo do que parece, http://tools.ietf.org/html/rfc3659.html)
Este método gerou a inutilização do NSLD, pois ele não seguia padrões, nenhuma convenção de entrega dos diretórios no FTP, o MSLD é justamente a proposta de um comando FTP que retorne uma lista do diretório de forma padronizada.
Então, segue um exemplo de como usar ela de maneira simples para realizar suas tarefas com o novo método:
>>> ftp_host = '' #seu host de conexão ao FTP >>> ftp_user = '' #seu usuario de FTP >>> ftp_pss = '' #a senha do usuário >>> ftp = FTP(host=ftp_host,user=ftp_user,passwd=ftp_pass) # você pode ignorar usuário e senha caso o FTP permita conexões anônimas. >>> ftp.mlsd <bound method FTP.mlsd of <ftplib.FTP object at 0x101146410>> >>> ftp.mlsd() <generator object mlsd at 0x1007ae550> >>> dir(ftp.mlsd()) ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__lt__', '__name__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'send', 'throw'] >>> for i in l: ... print(i) ... ('..', {'perm': 'flcdmpe', 'modify': '20110225132610', 'unique': '811U5E8CA8', 'unix.group': '2512', 'unix.mode': '0755', 'type': 'pdir', 'unix.owner': '2511'}) ('erros', {'perm': 'flcdmpe', 'modify': '20101202193850', 'unique': '811UA588C7', 'unix.group': '2512', 'unix.mode': '0755', 'type': 'dir', 'unix.owner': '2511'}) ('lojaexemplo2', {'perm': 'flcdmpe', 'modify': '20101025140404', 'unique': '811U64AE2C', 'unix.group': '2512', 'unix.mode': '0755', 'type': 'dir', 'unix.owner': '2511'}) ('robots.txt', {'perm': 'adfrw', 'size': '53', 'modify': '20101202193850', 'unique': '811UA588D2', 'unix.group': '2512', 'unix.mode': '0644', 'type': 'file', 'unix.owner': '2511'}) ('cgi-bin', {'perm': 'flcdmpe', 'modify': '20101202193850', 'unique': '811UA588BA', 'unix.group': '2512', 'unix.mode': '0755', 'type': 'dir', 'unix.owner': '2511'}) ('lojaexemplo-lib', {'perm': 'flcdmpe', 'modify': '20101025140630', 'unique': '811UA59D5A', 'unix.group': '2512', 'unix.mode': '0755', 'type': 'dir', 'unix.owner': '2511'})
Parece um pouco confuso acima com tantos dados?
É mais simples do que parece, navegar entre essa tupla e dict:
>>> for i in l: ... print(i[0]) ... lojaexemplo2 robots.txt lojaexemplo-lib Os atributos: >>> for i in l: ... print(i[1]) ... {'perm': 'flcdmpe', 'modify': '20110225132610', 'unique': '811U5E8CA8', 'unix.group': '2512', 'unix.mode': '0755', 'type': 'pdir', 'unix.owner': '2511'} {'perm': 'flcdmpe', 'modify': '20101025140404', 'unique': '811U64AE2C', 'unix.group': '2512', 'unix.mode': '0755', 'type': 'dir', 'unix.owner': '2511'} {'perm': 'adfrw', 'size': '547', 'modify': '20101202193852', 'unique': '811UA588ED', 'unix.group': '2512', 'unix.mode': '0644', 'type': 'file', 'unix.owner': '2511'} {'perm': 'flcdmpe', 'modify': '20101207203828', 'unique': '811UA59D79', 'unix.group': '2512', 'unix.mode': '0755', 'type': 'dir', 'unix.owner': '2511'}
Até ai beleza, mas ainda parece meio confuso ver exatamente o que você quer… então, vamos pegar e ver apenas os tipos:
>>> for i in l: ... print(i[1]['type']) ... pdir dir file dir
Mais simples né? Ai você pode fazer brincadeiras como verificar os tipos bem facilmente:
>>> l = ftp.mlsd() >>> for i in l: ... if i[1]['type'] == 'dir': print(i[0], "is a directory!") ... lojaexemplo2 is a directory! lojaexemplo-lib is a directory!
E é isso, ai, fica a sua imaginação como ela pode ser mais útil para cada caso, caso tenha dúvidas, deixe um comentário ou entre em contato comigo na pytche/matehackers!
Fonte: http://docs.python.org/3/library/ftplib.html?highlight=ftp#ftplib.FTP.mlsd