Reputation: 1866
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
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
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
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
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