web-dev-qa-db-ja.com

Python

Python=を使用していて、SFTPに接続してそこからXMLファイルを取得したいので、ローカルシステムに配置する必要があります。以下にコードを示します。

_import paramiko

sftpURL   =  'sftp.somewebsite.com'
sftpUser  =  'user_name'
sftpPass  =  'password'

ssh = paramiko.SSHClient()
# automatically add keys without requiring human intervention
ssh.set_missing_Host_key_policy( paramiko.AutoAddPolicy() )

ssh.connect(sftpURL, username=sftpUser, password=sftpPass)

ftp = ssh.open_sftp()
files = ftp.listdir()
print files
_

ここで接続は成功です。そして今、私はすべてのフォルダーとすべてのファイルを見たいと思います、そしてそこからXMLファイルを検索するために必要なフォルダーに入る必要があります。

最後に、私の意図は、SFTPサーバーに接続した後にすべてのフォルダーとファイルを表示することです。

上記のコードではftp.listdir()を使用していたため、以下のような出力が得られました

_['.bash_logout', '.bash_profile', '.bashrc', '.mozilla', 'testfile_248.xml']
_

これらが存在する唯一のファイルかどうかを知りたいですか?

そして、上記で使用したコマンドはフォルダも表示するのに適切ですか?

すべてのフォルダとファイルを表示するコマンドは何ですか?

1つの簡単な解決策は、ftp.listdir()の各オブジェクトのlstatの出力を調べることです。

すべてのディレクトリを一覧表示する方法は次のとおりです。

>>> for i in ftp.listdir():
...     lstatout=str(ftp.lstat(i)).split()[0]
...     if 'd' in lstatout: print i, 'is a directory'
... 

ファイルは逆の検索です:

>>> for i in ftp.listdir():
...     lstatout=str(ftp.lstat(i)).split()[0]
...     if 'd' not in lstatout: print i, 'is a file'
... 
9
Oz123

SFTPClient.listdir はすべて、ファイル、フォルダを返します。

フォルダがある場合、それらをファイルから区別するには、代わりに SFTPClient.listdir_attr を使用します。 SFTPAttributes のコレクションを返します。

from stat import S_ISDIR, S_ISREG
for entry in sftp.listdir_attr(remotedir):
    mode = entry.st_mode
    if S_ISDIR(mode):
        print(entry.filename + " is folder")
    Elif S_ISREG(mode):
        print(entry.filename + " is file")

@ Oz123が受け入れた回答は非効率的です。 SFTPClient.listdirは内部でSFTPClient.listdir_attrを呼び出し、ほとんどの情報を破棄してファイルとフォルダの名前のみを返します。その答えは、各ファイルに対してSFTPClient.lstatを呼び出すことによって、無駄に労力を費やしてすべてのデータを再取得します。

Paramikoを介してディレクトリ内のすべてのSFTPファイルのサイズを取得する方法 も参照してください。


必須の警告:AutoAddPolicyを使用しないでください–そうすることで MITM攻撃 に対する保護を失っています。正しい解決策については、 Paramiko "Unknown Server" を参照してください。

3
Martin Prikryl