Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 13, 2015 08:29:35

Veizdem
Зарегистрирован: 2015-01-13
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Дата создания файла на FTP

Доброе утро всем, подскажите пожалуйста, я делаю скрипт для создания бэкапов, в нем есть часть для отправки файлов на FTP сервер и часть для удаления файлов старше 10 дней. Для локальной папки разобрался, получаю список файлов в папке, для каждого файла получаю дату создания, сравниваю с текущей, если она больше 10 дней, то файл удаляется. А как подобное можно реализовать на FTP? Функционал тот же нужен, единственное файлы не локальные, а на удаленном FTP находятся.



В моих жилах текут нолики и единички…

Офлайн

#2 Янв. 13, 2015 08:48:48

alexbadaloff
От: Иваново
Зарегистрирован: 2013-04-11
Сообщения: 198
Репутация: +  16  -
Профиль   Отправить e-mail  

Дата создания файла на FTP

Если файлы только создаются, и в последствии не модифицируются, то подойдёт команда FTP:

MDTM — Возвращает время модификации файла.



————————–
Истина где-то рядом

Офлайн

#3 Янв. 13, 2015 08:51:49

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Дата создания файла на FTP

>>> 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.



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Янв. 13, 2015 08:55:28)

Офлайн

#4 Янв. 13, 2015 08:59:06

Veizdem
Зарегистрирован: 2015-01-13
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Дата создания файла на FTP

alexbadaloff
Если файлы только создаются, и в последствии не модифицируются, то подойдёт команда FTP:MDTM — Возвращает время модификации файла.
Пробую делать так:
ftp = FTP(FTP_serv, FTP_user, FTP_pass)
FTP_date = ftp.sendcmd('MDTM ' + fileName)
в ответ получаю результат: ‘213 20150113061129’
Как мне перевести этот “выхлоп” в формат, подходящий для кода:
for fileName in files:
    num = data1 - FTP_date
    if num > (86400 * days):
        ftp.delete(fileName)
Где дату я получаю так:
data1 = time.time()
Просто выхлоп в одном формате, а дата у меня получается типа float.



В моих жилах текут нолики и единички…

Офлайн

#5 Янв. 13, 2015 09:03:43

alexbadaloff
От: Иваново
Зарегистрирован: 2013-04-11
Сообщения: 198
Репутация: +  16  -
Профиль   Отправить e-mail  

Дата создания файла на FTP

Насколько я помню выхлоп в явном виде дата-время:
‘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)

Офлайн

#6 Янв. 13, 2015 09:13:18

Veizdem
Зарегистрирован: 2015-01-13
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Дата создания файла на FTP

alexbadaloff
Ещё надо учесть часовые пояса. Может быть нужно будет внести корректировку в часы.
Сервер и компьютер, где будет работать скрипт в одном часовом поясе, просто в разных концах города стоят. Насчет перевода даты, сейчас попробую привести в нужный тип.



В моих жилах текут нолики и единички…

Офлайн

#7 Янв. 13, 2015 09:20:17

alexbadaloff
От: Иваново
Зарегистрирован: 2013-04-11
Сообщения: 198
Репутация: +  16  -
Профиль   Отправить e-mail  

Дата создания файла на FTP

Как-то так можно:

>>>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)

Офлайн

#8 Янв. 13, 2015 09:53:57

Veizdem
Зарегистрирован: 2015-01-13
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Дата создания файла на FTP

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)

Офлайн

#9 Янв. 13, 2015 10:07:01

alexbadaloff
От: Иваново
Зарегистрирован: 2013-04-11
Сообщения: 198
Репутация: +  16  -
Профиль   Отправить e-mail  

Дата создания файла на FTP

Интересно, что случится, когда будет получен список файлов

FTP_files = ftp.nlst()
И после этого в for, когда он дойдет , например, до тысячного файла, но его не будет существовать, удалён или перемещён.

А случится следующее, за основу возьму всё же свой код, так как поменьше, а делает тоже самое:
>>> 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'
>>>



————————–
Истина где-то рядом

Офлайн

#10 Янв. 13, 2015 10:14:18

Veizdem
Зарегистрирован: 2015-01-13
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Дата создания файла на FTP

alexbadaloff
И после этого в for, когда он дойдет , например, до тысячного файла, но его не будет существовать, удалён или перемещён.
Доступ к удаленной папке есть только у этого скрипта через FTP. Соответственно, никто там без его ведома никуда ничего не перенесет. Да и файлов то там всего 16 штук будет.

Но на всякий случай, наверное нужно обработку исключения сделать, если там вдруг не строка с датой вернулась.



В моих жилах текут нолики и единички…

Отредактировано Veizdem (Янв. 13, 2015 10:15:16)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version