Форум сайта python.su
Доброе утро всем, подскажите пожалуйста, я делаю скрипт для создания бэкапов, в нем есть часть для отправки файлов на FTP сервер и часть для удаления файлов старше 10 дней. Для локальной папки разобрался, получаю список файлов в папке, для каждого файла получаю дату создания, сравниваю с текущей, если она больше 10 дней, то файл удаляется. А как подобное можно реализовать на FTP? Функционал тот же нужен, единственное файлы не локальные, а на удаленном FTP находятся.
Офлайн
Если файлы только создаются, и в последствии не модифицируются, то подойдёт команда FTP:
MDTM — Возвращает время модификации файла.
Офлайн
>>> from ftplib import FTP >>> ftp = FTP('ftp.debian.org') # connect to host, default port >>> ftp.login() # user anonymous, passwd anonymous@ '230 Login successful.' >>> ftp.cwd('debian') # change into "debian" directory >>> ftp.retrlines('LIST') # list directory contents -rw-rw-r-- 1 1176 1176 1063 Jun 15 10:18 README ... drwxr-sr-x 5 1176 1176 4096 Dec 19 2000 pool drwxr-sr-x 4 1176 1176 4096 Nov 17 2008 project drwxr-xr-x 3 1176 1176 4096 Oct 10 2012 tools '226 Directory send OK.' >>> modtime = f.sendcmd("MDTM file.name") # дата изменения >>> ftp.retrbinary('RETR README', open('README', 'wb').write) '226 Transfer complete.' >>> ftp.quit()
FTP.delete(filename)
Remove the file named filename from the server. If successful, returns the text of the response, otherwise raises error_perm on permission errors or error_reply on other errors.
Отредактировано terabayt (Янв. 13, 2015 08:55:28)
Офлайн
alexbadaloffПробую делать так:
Если файлы только создаются, и в последствии не модифицируются, то подойдёт команда FTP:MDTM — Возвращает время модификации файла.
ftp = FTP(FTP_serv, FTP_user, FTP_pass) FTP_date = ftp.sendcmd('MDTM ' + fileName)
for fileName in files: num = data1 - FTP_date if num > (86400 * days): ftp.delete(fileName)
data1 = time.time()
Офлайн
Насколько я помню выхлоп в явном виде дата-время:
‘213 20150113061129’, то есть 2015 год, 01 - месяц, 13 - число, 06 - час, 11 - минуты, 29 - секунды.
Вручную перевести в нужный формат. Думаю тут есть ответ, как вручную переделать: http://kamedov.ru/preobrazovanie-daty-v-python-iz-datetime-v-time/
Ещё надо учесть часовые пояса. Может быть нужно будет внести корректировку в часы.
Отредактировано alexbadaloff (Янв. 13, 2015 09:07:14)
Офлайн
alexbadaloffСервер и компьютер, где будет работать скрипт в одном часовом поясе, просто в разных концах города стоят. Насчет перевода даты, сейчас попробую привести в нужный тип.
Ещё надо учесть часовые пояса. Может быть нужно будет внести корректировку в часы.
Офлайн
Как-то так можно:
>>>import datetime >>>import time >>>time.mktime(datetime.datetime.strptime('213 20150113061129'[4:], "%Y%m%d%H%M%S").timetuple()) 1421118689.0
Отредактировано alexbadaloff (Янв. 13, 2015 09:21:19)
Офлайн
alexbadaloffЯ наверное не познал еще всех удобств питона, потому сделал все так:
Как-то так можно
ftp = FTP(FTP_serv, FTP_user, FTP_pass) FTP_files = ftp.nlst() for fileName in FTP_files: FTP_date = ftp.sendcmd('MDTM ' + fileName) FTP_year = int(FTP_date[4:8]) FTP_month = int(FTP_date[8:10]) FTP_day = int(FTP_date[10:12]) FTP_hour = int(FTP_date[12:14]) FTP_min = int(FTP_date[14:16]) FTP_sec = int(FTP_date[16:18]) dt_obj = datetime(FTP_year, FTP_month, FTP_day, FTP_hour, FTP_min, FTP_sec) time_tuple = dt_obj.timetuple() FTP_date = time.mktime(time_tuple) num = data1 - FTP_date if num > (86400 * days): ftp.delete(fileName) log.write(datetime.datetime.now().ctime() + ' => Файл ' + fileName + ' удален\n') ftp.close()
Отредактировано Veizdem (Янв. 13, 2015 09:54:13)
Офлайн
Интересно, что случится, когда будет получен список файлов
FTP_files = ftp.nlst()
>>> import datetime >>> import time >>> time.mktime(datetime.datetime.strptime('550 File not found'[4:], "%Y%m%d%H%M%S").timetuple()) Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> time.mktime(datetime.datetime.strptime('550 File not found'[4:], "%Y%m%d%H%M%S").timetuple()) File "C:\Python34\lib\_strptime.py", line 500, in _strptime_datetime tt, fraction = _strptime(data_string, format) File "C:\Python34\lib\_strptime.py", line 337, in _strptime (data_string, format)) ValueError: time data 'File not found' does not match format '%Y%m%d%H%M%S' >>>
Офлайн
alexbadaloffДоступ к удаленной папке есть только у этого скрипта через FTP. Соответственно, никто там без его ведома никуда ничего не перенесет. Да и файлов то там всего 16 штук будет.
И после этого в for, когда он дойдет , например, до тысячного файла, но его не будет существовать, удалён или перемещён.
Отредактировано Veizdem (Янв. 13, 2015 10:15:16)
Офлайн