Mengapa Anda tidak menggunakan opsi direktori berikutnya?
ftp.dir('-t',data.append)
Dengan opsi ini, daftar file diatur waktunya dari terbaru ke terlama. Kemudian cukup ambil file pertama dalam daftar untuk mengunduhnya.
Bagi mereka yang mencari solusi lengkap untuk menemukan file terbaru di folder:
MLSD
Jika server FTP Anda mendukung MLSD
perintah, solusinya mudah:
entries = list(ftp.mlsd())
entries.sort(key = lambda entry: entry[1]['modify'], reverse = True)
latest_name = entries[0][0]
print(latest_name)
DAFTAR
Jika Anda perlu mengandalkan LIST
yang sudah usang perintah, Anda harus menguraikan daftar hak milik yang dikembalikannya.
Listingan *nix umum seperti:
-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
Dengan cantuman seperti ini, kode ini akan berfungsi:
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)
Ini adalah pendekatan yang agak rapuh.
MDTM
Cara yang lebih andal, tetapi kurang efisien, adalah menggunakan MDTM
perintah untuk mengambil stempel waktu dari masing-masing file/folder:
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)
Untuk versi kode alternatif, lihat jawaban dari @Paulo.
Sakelar -t tidak standar
Beberapa server FTP mendukung -t
non-standar beralih ke NLST
(atau LIST
) perintah.
lines = ftp.nlst("-t")
latest_name = lines[-1]
Lihat Cara mendapatkan file di folder FTP yang diurutkan berdasarkan waktu modifikasi.
Mengunduh file yang ditemukan
Apa pun pendekatan yang Anda gunakan, setelah Anda memiliki latest_name
, Anda mendownloadnya seperti file lainnya:
with open(latest_name, 'wb') as f:
ftp.retrbinary('RETR '+ latest_name, f.write)
Lihat juga
- Dapatkan nama folder FTP terbaru dengan Python
- Cara mendapatkan waktu modifikasi file FTP menggunakan Python ftplib
Dengan NLST
, seperti yang ditunjukkan dalam respons Martin Prikryl, Anda harus menggunakan sorted
metode:
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]