70

Pythonでの完全なFTPサポートにはftplibを使用できます。ただし、ディレクトリリストを取得するための推奨される方法は次のとおりです。

# File: ftplib-example-1.py

import ftplib

ftp = ftplib.FTP("www.python.org")
ftp.login("anonymous", "ftplib-example-1")

data = []

ftp.dir(data.append)

ftp.quit()

for line in data:
    print "-", line

どちらが得られますか:

$ python ftplib-example-1.py
- total 34
- drwxrwxr-x  11 root     4127         512 Sep 14 14:18 .
- drwxrwxr-x  11 root     4127         512 Sep 14 14:18 ..
- drwxrwxr-x   2 root     4127         512 Sep 13 15:18 RCS
- lrwxrwxrwx   1 root     bin           11 Jun 29 14:34 README -> welcome.msg
- drwxr-xr-x   3 root     wheel        512 May 19  1998 bin
- drwxr-sr-x   3 root     1400         512 Jun  9  1997 dev
- drwxrwxr--   2 root     4127         512 Feb  8  1998 dup
- drwxr-xr-x   3 root     wheel        512 May 19  1998 etc
...

結果を解析してディレクトリリストを取得するのがアイデアだと思います。ただし、このリストは、FTPサーバーのリストのフォーマット方法に直接依存しています。FTPサーバーがこのリストをフォーマットする可能性のあるさまざまな方法をすべて予測する必要があるため、このためのコードを作成するのは非常に面倒です。

ディレクトリリストで配列を埋めるポータブルな方法はありますか?

(アレイにはフォルダー名のみが含まれている必要があります。)

4

7 に答える 7

139

を使用してみてくださいftp.nlst(dir)

ただし、フォルダが空の場合、エラーがスローされる可能性があることに注意してください。

files = []

try:
    files = ftp.nlst()
except ftplib.error_perm as resp:
    if str(resp) == "550 No files found":
        print "No files in this directory"
    else:
        raise

for f in files:
    print f
于 2008-09-21T20:15:59.517 に答える
33

FTP ディレクトリの一覧を解析する信頼できる/標準化された方法は、MLSD コマンドを使用することです。これは、最近のすべての適切な FTP サーバーでサポートされているはずです。

import ftplib
f = ftplib.FTP()
f.connect("localhost")
f.login()
ls = []
f.retrlines('MLSD', ls.append)
for entry in ls:
    print entry

上記のコードは次のように表示されます。

modify=20110723201710;perm=el;size=4096;type=dir;unique=807g4e5a5; tests
modify=20111206092323;perm=el;size=4096;type=dir;unique=807g1008e0; .xchat2
modify=20111022125631;perm=el;size=4096;type=dir;unique=807g10001a; .gconfd
modify=20110808185618;perm=el;size=4096;type=dir;unique=807g160f9a; .skychart
...

Python 3.3 から、ftplib はこれを行うための特定の方法を提供します。

于 2011-12-12T13:10:19.507 に答える
7

ファイル名、最終変更スタンプ、ファイルサイズなどを取得しようとしているときにここにたどり着き、自分のコードを追加したいと思いました。(テキスト行をクリーンアップするため) などftp.dir(dir_list.append)の Python std lib の使用を解析し、配列を作成するためのループを作成するのに数分しかかかりませんでした。strip()split()

ftp = FTP('sick.domain.bro')
ftp.login()
ftp.cwd('path/to/data')

dir_list = []
ftp.dir(dir_list.append)

# main thing is identifing which char marks start of good stuff
# '-rw-r--r--   1 ppsrt    ppsrt      545498 Jul 23 12:07 FILENAME.FOO
#                               ^  (that is line[29])

for line in dir_list:
   print line[29:].strip().split(' ') # got yerself an array there bud!
   # EX ['545498', 'Jul', '23', '12:07', 'FILENAME.FOO']
于 2017-08-14T22:52:07.497 に答える
2

LIST応答のレイアウトに標準はありません。最も一般的なレイアウトを処理するには、コードを作成する必要があります。Linuxlsおよび Windows ServerDIRフォーマットから始めます。といっても、いろいろな種類があります。

長いリストを解析できない場合nlstは、(コマンドの結果を返す) メソッドにフォールバックします。NLSTおまけとして、カンニング: おそらく、既知のファイル名を含む行で最も長い数字がその長さです。

于 2008-09-21T20:20:36.417 に答える
1

MLSD をサポートしていないように見える FTP サーバー (Rackspace Cloud Sites 仮想サーバー) にたまたま行き詰まっています。それでも、ファイル名だけでなく、サイズやタイムスタンプなど、ファイル情報のいくつかのフィールドが必要なので、DIR コマンドを使用する必要があります。このサーバーでは、DIR の出力は OP と非常によく似ています。誰にでも役立つ場合に備えて、このような出力の行を解析してファイル名、サイズ、タイムスタンプを取得する小さな Python クラスを次に示します。

日時のインポート

class FtpDir:
    def parse_dir_line(self, line):
        words = line.split()
        self.filename = words[8]
        self.size = int(words[4])
        t = words[7].split(':')
        ts = words[5] + '-' + words[6] + '-' + datetime.datetime.now().strftime('%Y') + ' ' + t[0] + ':' + t[1]
        self.timestamp = datetime.datetime.strptime(ts, '%b-%d-%Y %H:%M')

移植性は高くありませんが、さまざまな FTP サーバーに対応するように拡張または変更するのは簡単です。

于 2014-06-06T20:50:39.497 に答える