- Python-сообщество
- #1 Янв. 13, 2015 08:29:35
- Дата создания файла на FTP
- #2 Янв. 13, 2015 08:48:48
- Дата создания файла на FTP
- #3 Янв. 13, 2015 08:51:49
- Дата создания файла на FTP
- #4 Янв. 13, 2015 08:59:06
- Дата создания файла на FTP
- #5 Янв. 13, 2015 09:03:43
- Дата создания файла на FTP
- #6 Янв. 13, 2015 09:13:18
- Дата создания файла на FTP
- #7 Янв. 13, 2015 09:20:17
- Дата создания файла на FTP
- Метод retrlines не возвращает ГОД в атрибутах файлов директории
- Как получить время изменения файла FTP с помощью Python ftplib
- 2 ответа
- MLST или MDTM
- MLSD
- СПИСОК
- Найти последний файл
Python-сообщество
- Начало
- » Python для новичков
- » Дата создания файла на FTP
#1 Янв. 13, 2015 08:29:35
Дата создания файла на 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.
Отредактировано terabayt (Янв. 13, 2015 08:55:28)
#4 Янв. 13, 2015 08:59:06
Дата создания файла на 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)
В моих жилах текут нолики и единички…
#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
Дата создания файла на FTP
Сервер и компьютер, где будет работать скрипт в одном часовом поясе, просто в разных концах города стоят. Насчет перевода даты, сейчас попробую привести в нужный тип.
В моих жилах текут нолики и единички…
#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)
Метод retrlines не возвращает ГОД в атрибутах файлов директории
Доброго времени суток, уважаемые. Столкнулся с такой проблемой при использовании ftplib в python: Пытаюсь получить список содержимого в директории на ftp. Для некоторых файлов retrlines(‘LIST’, callback=log.append) возвращает год (YYYY),а для некоторых на месте года я вижу час и минуту (HH:MM). Мне казалось, что решение — использовать комманду MLSD, но, похоже, она поддерживается не всеми ftp-серверами. Возникает вопрос — есть какой-нибудь универсальный способ получить дату создания/модификации файла на ftp в полном формате (dir и т.п. отображает тоже не все)?
import ftplib def ftp_connect(url,login,passwd,fromdir): #Подключение к FTP и определение списка файлов try: ftp=ftplib.FTP(url,login,passwd) print ("Connection successful, trying to get list of files and directories. ") ftp.cwd(fromdir) #Записываем содержимое домашней директории ftp.retrlines('LIST', callback=log.append) #ftp.retrlines('MLSD', callback=log.append) files = (';'.join(line.split()) for line in log) directory_list = list(files) #Разделяем полученные данные на файлы и каталоги for str in directory_list: s = str.split(' ')[0][0] #Если это каталог, записываем его в спи сок подкаталогов if s=='d': sub_dir_list.append(str.split(';')[8]) #Если это файл, то проверяем его дату создания и скачиваем в папку с путем #к текущей директории в названии elif s=='-': print (str.split(';')[1:]) ftp.quit() return True except ftplib.all_errors as e: print (e) return False #Инициализации програмы try: url = 'ftp.gnu.org' login = "Anonymous" passwd = "" todir = '/ftp/' fromdir = '~/' log = [] sub_dir_list = [] print ("Initialization successful, trying to connect. ") ftp_connect(url,login,passwd,fromdir) except: print ("Initialization Error") exit()
PS. Пробовал через ftputil ее методами вроде path.getmtime и download_if_newer — результат отрицательный. getmtime там также показывает дату в странном формате, может дело в этом. PPS. Пример того, что возвращается для этого куска «кода»:
['1', '0', '0', '17864', 'Oct', '23', '2003', 'MISSING-FILES'] ['2', '0', '0', '4178', 'Aug', '13', '2003', 'MISSING-FILES.README'] ['1', '0', '0', '1962', 'Nov', '15', '2012', 'README'] ['1', '0', '0', '405121', 'Oct', '23', '2003', 'before-2003-08-01.md5sums.asc'] ['1', '0', '0', '200401', 'Mar', '05', '11:25', 'find.txt.gz'] ['1', '0', '0', '386743', 'Mar', '05', '11:25', 'ls-lrRt.txt.gz'] ['1', '0', '0', '954', 'Aug', '13', '2003', 'welcome.msg']
upd. Задача — скрипт на py спсобный скачать с фтп все файлы новее вчерашней даты. upd2. Похоже getmtime из ftputil все же решает мою «проблему»
Как получить время изменения файла FTP с помощью Python ftplib
Я пытаюсь загрузить CSV файл в Amazon S3 с помощью Python. Мне нужно знать время изменения файла CSV. Я использую ftplib для подключения FTP с Python (2.7).
Смотрите os.stat для 3 os.stat даты и времени. Обратите внимание, что время модификации может означать разные вещи в разных системах.
2 ответа
MLST или MDTM
Хотя вы можете получить MDTM метку отдельного файла по FTP с MDTM команд MLST или MDTM , ни одна из них не поддерживается ftplib.
Конечно, вы можете реализовать MLST или MDTM самостоятельно, используя FTP.voidcmd .
from ftplib import FTP from dateutil import parser # . (connection to FTP) timestamp = ftp.voidcmd("MDTM /remote/path/file.txt")[4:].strip() time = parser.parse(timestamp) print(time)
MLSD
Единственная команда, явно поддерживаемая библиотекой ftplib, которая может вернуть стандартизированную MLSD метку файла, — это MLSD через метод FTP.mlsd . Хотя его использование имеет смысл, только если вы хотите получить временные метки для большего количества файлов.
- Получить полный список каталогов, используя MLSD
- Найдите в возвращенной коллекции нужные вам файлы.
- Получить modify факт
- Разобрать его по спецификации, YYYYMMDDHHMMSS[.sss]
За подробностями обращайтесь к RFC 3659, в частности:
from ftplib import FTP from dateutil import parser # . (connection to FTP) files = ftp.mlsd("/remote/path") for file in files: name = file[0] timestamp = file[1]['modify'] time = parser.parse(timestamp) print(name + ' - ' + str(time))
Обратите внимание, что время, возвращаемое MLST , MLSD и MDTM указано в UTC (если сервер не работает). Поэтому вам может потребоваться исправить их в соответствии с местным часовым поясом.
Опять же, обратитесь к RFC 3659 2.3. Времена раздела:
Значения времени всегда представлены в UTC (GMT) и в григорианском календаре, независимо от того, какой календарь мог использоваться в дату и время, указанные в местоположении сервера PI.
СПИСОК
Если FTP-сервер не поддерживает ни MLST , MLSD MDTM , ни MDTM , все, что вы можете сделать, — это использовать устаревшую команду LIST . Это включает в себя разбор запатентованного списка, который он возвращает.
Распространенный список * nix выглядит так:
-rw-r--r-- 1 user group 4467 Mar 27 2018 file1.zip -rw-r--r-- 1 user group 124529 Jun 18 15:31 file2.zip
С таким списком, этот код будет делать:
from ftplib import FTP from dateutil import parser # . (connection to FTP) lines = [] ftp.dir("/remote/path", lines.append) for line in lines: tokens = line.split(maxsplit = 9) name = tokens[8] time_str = tokens[5] + " " + tokens[6] + " " + tokens[7] time = parser.parse(time_str) print(name + ' - ' + str(time))
Найти последний файл
Спасибо за ответ! Я использую: «ftp.sendcmd (‘MDTM’ + имя файла)», но он отличается от моей отметки времени. На ftp последнее время модификации — 01:00, но когда я пытаюсь проверить с помощью python, наступает 23:00. Как я могу это исправить или добавить еще 2 часа к своему коду?
Я проверил свой часовой пояс, и все в порядке. Когда я пытаюсь проверить текущую дату с помощью Python, это правда. Но FTP изменить время все равно неверно. Когда я пытаюсь проверить FTP, то же самое с моей страной, правда.
Значение, которое вы получаете от MDTM находится в часовом поясе UTC. Это не имеет никакого отношения к тому, какой часовой пояс установлен на вашем локальном компьютере или на сервере. Вы должны преобразовать значение, которое вы получаете с FTP-сервера самостоятельно (программно), в ваш местный часовой пояс (если это то, что вам нужно).
Что ж, просто добавьте / вычтите количество часов, в течение которых ваш местный часовой пояс «далеко» от GMT.
Когда я хочу изменить время изменения файла, я использую FTP-клиент на консоли. Войдите в систему на удаленном FTP ftp ftp.dic.com
- Команды cd переходят в правильный каталог
- Команда SITE для перемещения расширенного командного режима
- UTIME somefile.txt 20050101123000 20050101123000 20050101123000 UTC
изменить время доступа, время модификации, время создания каталога в 2005-01-01 12:30:00 somefile.txt
сайт UTIME somefile.txt 20150331122000 20150331122000 20150331122000 UTC
Пожалуйста, не стесняйтесь отдыхать и пожелать вам приятного путешествия во времени 🙂