LINUX.ORG.RU

Метод retrlines не возвращает ГОД в атрибутах файлов директории

 


0

1

Доброго времени суток, уважаемые. Столкнулся с такой проблемой при использовании 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 все же решает мою «проблему»



Последнее исправление: Nemui (всего исправлений: 5)

Какая изначально стоит задача?
Та портянка текста выше, очевидно не задача, а попытка решения.

zolden ★★★★★
()
Ответ на: комментарий от Nemui

Спрошу на случай если это не спортивный интерес и не в целях обучения.
1. использование FTP принципиально или есть альтернативные способы доступа к серверу?
2. нельзя ли решить это на стороне сервера, скажем, выкладывая файлы в директории названные по датам?

zolden ★★★★★
()
Последнее исправление: zolden (всего исправлений: 1)
Ответ на: комментарий от zolden

Доступа к настройкам самого сервера нет. Контакта с его администрацией тоже, поэтому какие-то изменения на нем самом сделать не представляется возможным.

Nemui
() автор топика

Попробуй так. Через MDTM (ftp modtime).

$ cat ftp2.py 
#!/usr/bin/python
# -*- coding: utf-8 -*-

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)

        print "Current dir = ", ftp.pwd()
        fl=list(ftp.nlst())
        for f in fl:
            print f, " = ", ftp.sendcmd("MDTM " + f)

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

Результат:

$ ./ftp2.py
Initialization successful, trying to connect...
Connection successful, trying to get list of files and directories...
Current dir =  /
CRYPTO.README  =  213 20040817213118
MISSING-FILES  =  213 20031023165743
MISSING-FILES.README  =  213 20030813230536
README  =  213 20121115033101
before-2003-08-01.md5sums.asc  =  213 20031023165556
find.txt.gz  =  213 20150305112510
gnu  =  550 Could not get file modification time.

justAmoment ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.