Blog do Matehackers

Python 3.3 + FTP

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