Ls foi projetado para consumo humano e você não deve analisar sua saída .
Nos scripts shell, existem alguns casos em que a análise da saída de ls funciona é a maneira mais simples de obter o efeito desejado. Como ls pode manipular caracteres não ASCII e controlar nomes de arquivos, esses casos são um subconjunto daqueles que não exigem a obtenção de um nome de arquivo ls.
Em python, não há absolutamente nenhuma razão para invocar ls. Python possui todas lsas funcionalidades incorporadas. Use os.listdirpara listar o conteúdo de um diretório e / os.statou osobter metadados do arquivo. Outras funções nos osmódulos provavelmente também serão relevantes para o seu problema.
Se você estiver acessando arquivos remotos pelo ssh, uma maneira razoavelmente robusta de listar nomes de arquivos é através do sftp:
echo ls -1 | sftp remote-site:dir
Isso imprime um nome de arquivo por linha e, diferentemente do lsutilitário, sftpnão altera caracteres não imprimíveis. Você ainda não poderá listar de maneira confiável os diretórios nos quais um nome de arquivo contém uma nova linha, mas isso raramente é feito (lembre-se disso como um problema de segurança em potencial, não um problema de usabilidade).
Em python (lembre-se de que os metacaracteres do shell devem ser escapados remote_dir):
command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")
Para interações mais complexas, consulte o modo de lote do sftp na documentação.
Em alguns sistemas (Linux, Mac OS X, talvez alguns outros, mas definitivamente não o Windows), uma abordagem diferente é montar um sistema de arquivos remoto através do ssh com sshfs e depois trabalhar localmente.