jdeuce
jdeuce

Reputation: 1866

How can I set the last modified time of a file from python?

I have a python script that downloads a file over FTP using ftplib.

My current download code looks just like the example in the ftp lib docs:

ftp.retrbinary('RETR README', open('README', 'wb').write)

Now I have a requirement that the file downloaded over FTP needs to have the same last modified time as the file on the FTP server itself. Assuming I could parse out the time from ftp.retrlines('list'), how can I set the modified time on the downloaded file?

I'm on a unix based OS if that matters.

Upvotes: 115

Views: 82731

Answers (5)

Richard Shu
Richard Shu

Reputation: 21

Somehow the time.time() doesn't work as access_time and modification_time here, as I got TypeError: 'builtin_function_or_method' object cannot be interpreted as an integer. The following is borrowed from the previous answers, and it works for me.

dt = datetime.datetime.now()
ts = dt.astimezone(datetime.timezone.utc).timestamp()
os.utime(file_path, times=(ts, ts))

Upvotes: 0

Jacek Pliszka
Jacek Pliszka

Reputation: 21

No point in using datetime above - use time.time() instead.

Upvotes: 0

Jossef Harush Kadouri
Jossef Harush Kadouri

Reputation: 34207

To edit a file last modified field, use:

os.utime(<file path>, (<access date epoch>, <modification date epoch>))

Example:

os.utime(r'C:\my\file\path.pdf', (1602179630, 1602179630))

💡 - Epoch is the number of seconds that have elapsed since January 1, 1970. see more


If you are looking for a datetime version:

import datetime
import os

def set_file_last_modified(file_path, dt):
    dt_epoch = dt.timestamp()
    os.utime(file_path, (dt_epoch, dt_epoch))

# ...

now = datetime.datetime.now()
set_file_last_modified(r'C:\my\file\path.pdf', now)

💡 - For Python versions < 3.3 use dt_epoch = time.mktime(dt.timetuple())

Upvotes: 58

Charlie
Charlie

Reputation: 9098

Use os.utime:

import os

os.utime(path_to_file, (access_time, modification_time))

More elaborate example: https://www.tutorialspoint.com/python/os_utime.htm

Upvotes: 126

The Veritable Bugeater
The Veritable Bugeater

Reputation: 241

There are 2 ways to do this. One is the os.utime example which is required if you are setting the timestamp on a file that has no reference stats.

However, if you are copying the files with shutil.copy() you have a reference file. Then if you want the permission bits, last access time, last modification time, and flags also copied, you can use shutil.copystat() immediately after the shutil.copy().

And then there is shutil.copy2 which is intended to do both at once...

Upvotes: 23

Related Questions