5

ftp ディレクトリのすべてのディレクトリを一覧表示してから、それぞれを入力したいと思います。問題は、私のコードもファイルをリストし、それらも入力しようとすることです。

  1. メソッド ftp.cwd から戻り値を取得する方法はありますか?
  2. そもそもディレクトリ名だけを取得する方法はありますか、それとも私がやりたいことを行うためのより良い方法があります。

ここに私が今使っているコードがあります:

    from ftplib import FTP
    ftp = FTP('ftp.overtherainbow.com')
    ftp.login()
    for name in ftp.nlst():
        print "listing: " + name
        ftp.cwd(name)
        ftp.retrlines('LIST')
        ftp.cwd('../')
4

4 に答える 4

6

FTPプロトコルには、ディレクトリとファイルを区別する方法がありません(リストに関して)。最善の策は、試して失敗することだと思います

try:
    ftp.cwd(name)
except ftplib.error_perm as detail:
    print("It's probably not a directory:", detail)

または、ディレクトリリストからの出力を解析することもできます。ただし、ディレクトリリストはOSごとに異なるため、これはプラットフォームに依存しません。ここに示すように...

于 2011-05-29T17:42:59.327 に答える
2

ここに Python 3.3 ソリューション (mlsd) があります: http://docs.python.org/3/library/ftplib.html#ftplib.FTP.mlsd

ftp.nlst と ftp.dir は「バージョン 3.3 以降は非推奨です。代わりに mlsd() を使用してください。」

于 2013-05-22T09:46:51.747 に答える
1

これは少し醜いですが、ftplibあまり使いにくいようです。

>>> x=[]
>>> ftp.dir('-d','*/',lambda L:x.append(L.split()[-1]))
>>> x
['access-logs/', 'etc/', 'mail/', 'perl/', 'proxy/', 'public_ftp/', 'public_html/', 'subversion/', 'tmp/', 'web/', 'www/']
于 2011-05-29T18:07:41.203 に答える
0

それは私のために働いた:

def get_current_dir_subdirs(self):
    ret = []
    self.ftp.dir("",ret.append)
    ret = [x.split()[-1] for x in ret if x.startswith("d")]
    return ret 
于 2011-10-07T10:05:18.117 に答える