New Dev
New Dev

Reputation: 83

Moving Files by creation/modification date then moving with Python

I am new to programming, even more so with Python. So please excuse any ignorance on my part. I am trying to write a script for myself that will move files that have been modified in the last 24 hours. So far I have came up with this:

import datetime
import os
import shutil


src = "C:\Users\Student\Desktop\FolderA"
dst = "C:\Users\Student\Desktop\FolderB"


now = dt.datetime.now()
before = now - dt.timedelta(hours=24)

def mins_since_mod(fname):
    return (os.path.getmtime(fname))


for fname in os.listdir(src):
    if mins_since_mod > before:
        src_fname = os.path.join(src,fname)
        os.path.join(dst,fname)
        shutil.move(src_fname, dst)

I know i'm close to the solution, but I can't seem to figure out how to get this to work. I looked around here on the community and was not able to find a solution to my problem. Thank you for any leads or suggestions.

Upvotes: 6

Views: 7124

Answers (2)

CFNZ_Techie
CFNZ_Techie

Reputation: 213

Hey mate I have actually just done something like this myself. I found that there will be a few issues will the time comparison as well as some issues in comparing and moving folders.

Try this:

import os
import shutil
import datetime

def filter_by_date(src_folder, archive_date):
    os.chdir(src_folder)
    delay_time = 24 * 60 * 60
    archive_period = archive_date - delay_time
    return [
        name for name in os.listdir(u'.')
        if os.path.isdir(name)
        and datetime.datetime.fromtimestamp(os.path.getmtime(name)) < archive_period
    ]


if __name__ == '__main__':
    folders = filter_by_date("C:/Users/Student/Desktop/FolderA", time.time())
    for files in folders:
        print files
        try:
            shutil.copytree(files, os.path.join("C:/Users/Student/Desktop/New", files))
        except OSError as e:
            print('\nDirectory not copied. Error: %s' % e)
        except shutil.Error as e:
            try:
                files = files.encode('UTF-8')
                dst_path = os.path.join('C:/Users/Student/Desktop/FolderB/', files)
                shutil.copytree(files, dst_path)
            finally:
                print('\nDirectory not copied. Error: %s' % e)

    print "\Completed"

This is going to ensure any file name (including Chinese, Russian and Japanese will be copied) and any folder (directory or sub-directory) is copied. It will also keep all file attributes.

Upvotes: 2

Iluvatar
Iluvatar

Reputation: 1537

There are a few things to change. First, you can't compare the datetime in before to the Unix timestamp that getmtime() returns. It's easier to just use that directly. Also, you actually need to pass the (full) filename to mins_since_mod() for it to do anything.

Here's something that should work, changing the name of mins_since_mod() to reflect what it does better:

import time
import os
import shutil

SECONDS_IN_DAY = 24 * 60 * 60

src = "C:\Users\Student\Desktop\FolderA"
dst = "C:\Users\Student\Desktop\FolderB"

now = time.time()
before = now - SECONDS_IN_DAY

def last_mod_time(fname):
    return os.path.getmtime(fname)

for fname in os.listdir(src):
    src_fname = os.path.join(src, fname)
    if last_mod_time(src_fname) > before:
        dst_fname = os.path.join(dst, fname)
        shutil.move(src_fname, dst_fname)

Upvotes: 5

Related Questions