Python ftp дата файла

Python-сообщество

[RSS Feed]

  • Начало
  • » 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

Читайте также:  Two column two row css

Дата создания файла на 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

Пожалуйста, не стесняйтесь отдыхать и пожелать вам приятного путешествия во времени 🙂

Источник

Оцените статью