next dir オプションを使用しないのはなぜですか?
ftp.dir('-t',data.append)
このオプションを使用すると、ファイルのリストは新しいものから古いものの順に並べられます。次に、リストの最初のファイルを取得してダウンロードします。
フォルダー内の最新のファイルを見つけるための完全なソリューションをお探しの方:
MLSD
FTP サーバーが MLSD
をサポートしている場合 コマンド、解決策は簡単です:
entries = list(ftp.mlsd())
entries.sort(key = lambda entry: entry[1]['modify'], reverse = True)
latest_name = entries[0][0]
print(latest_name)
リスト
古い LIST
に頼る必要がある場合 コマンドで返される独自のリストを解析する必要があります。
一般的な *nix リストは次のようになります:
-rw-r--r-- 1 user group 4467 Mar 27 2018 file1.zip
-rw-r--r-- 1 user group 124529 Jun 18 15:31 file2.zip
このようなリストでは、次のコードで実行できます:
from dateutil import parser
# ...
lines = []
ftp.dir("", lines.append)
latest_time = None
latest_name = None
for line in lines:
tokens = line.split(maxsplit = 9)
time_str = tokens[5] + " " + tokens[6] + " " + tokens[7]
time = parser.parse(time_str)
if (latest_time is None) or (time > latest_time):
latest_name = tokens[8]
latest_time = time
print(latest_name)
これはかなり脆弱なアプローチです。
MDTM
MDTM
を使用すると、より信頼性が高くなりますが、効率が低下します。 個々のファイル/フォルダーのタイムスタンプを取得するコマンド:
names = ftp.nlst()
latest_time = None
latest_name = None
for name in names:
time = ftp.voidcmd("MDTM " + name)
if (latest_time is None) or (time > latest_time):
latest_name = name
latest_time = time
print(latest_name)
コードの代替バージョンについては、@Paulo による回答を参照してください。
非標準の -t スイッチ
一部の FTP サーバーは、独自の非標準 -t
をサポートしています。 NLST
のスイッチ (または LIST
) コマンド。
lines = ftp.nlst("-t")
latest_name = lines[-1]
FTP フォルダー内のファイルを変更時刻順に並べ替える方法を参照してください。
見つかったファイルをダウンロードしています
latest_name
を取得したら、どのようなアプローチを使用しても構いません。 、他のファイルとしてダウンロードします:
with open(latest_name, 'wb') as f:
ftp.retrbinary('RETR '+ latest_name, f.write)
こちらもご覧ください
- Python で最新の FTP フォルダ名を取得する
- Python ftplib を使用して FTP ファイルの変更時刻を取得する方法
NLST
で 、Martin Prikryl の応答に示されているように、sorted
を使用する必要があります メソッド:
ftp = FTP(host="127.0.0.1", user="u",passwd="p")
ftp.cwd("/data")
file_name = sorted(ftp.nlst(), key=lambda x: ftp.voidcmd(f"MDTM {x}"))[-1]