Download only yesterday's file with FTP in Python

Question:

I want to download only yesterday’s file via FTP with below Python programming code, below code download all the files.
I want to check last modification timestamp in code against yesterday’s date and download only yesterday’s files automatically. I really need help and appreciate for any suggestion:

import ftplib
import os
from datetime import date 
from dateutil import parser

FTP_HOST = "Remote IP"
FTP_USER = "Username"
FTP_PASS = "Password"

# some utility functions that we gonna need
def get_size_format(n, suffix="B"):
    # converts bytes to scaled format (e.g KB, MB, etc.)
    for unit in ["", "K", "M", "G", "T", "P"]:
        if n < 1024:
            return f"{n:.2f}{unit}{suffix}"
        n /= 1024

def get_datetime_format(date_time):
    # convert to datetime object
    date_time = datetime.strptime(date_time, "%Y%m%d%H%M%S")
    # convert to human readable date time string
    return date_time.strftime("%Y/%m/%d %H:%M:%S")
    
# initialize FTP session
ftp = ftplib.FTP(FTP_HOST, FTP_USER, FTP_PASS)
# force UTF-8 encoding
ftp.encoding = "utf-8"
# print the welcome message
print(ftp.getwelcome())
# change the current working directory to 'pub' folder and 'maps' subfolder
ftp.cwd("RemoteDirectory")

print("*"*50, "NLST", "*"*50)

print("{:20} {:19}".format("File_Name", "last_modified"))

for file_data in ftp.mlsd():
    file_name,meta = file_data
    # convert it to human readable format (i.e in 'KB', 'MB', etc)
    last_modified = get_datetime_format(meta.get("modify"))
  
    try:
        ftp.cwd(file_name)
        
    except Exception as e:
        ftp.voidcmd("TYPE I")
        last_modified = get_datetime_format(meta.get("modify"))
        
        
    print(f"{file_name:20} {last_modified:19}")
    ftp.retrbinary("RETR " + file_name, open(file_name, 'wb').write)

# quit and close the connection
ftp.quit()
Asked By: Saher

||

Answers:

Based on Python Datetime: All Items From Yesterday, this should do:

yesterday = date.today() - timedelta(days=1)

for file_data in ftp.mlsd():
    file_name,meta = file_data
    last_modified = datetime.strptime(meta.get("modify"), "%Y%m%d%H%M%S")
    if last_modified.date() == yesterday:
        ftp.retrbinary("RETR " + file_name, open(file_name, 'wb').write)

If the server does not support MLSD command, you will have to use less efficient options with LIST or MDTM. See:

Answered By: Martin Prikryl
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.