Загрузка файлов с FTP-сервера, который обновляется за последние n часов

#python #ftp #ftplib

#python #ftp #ftplib

Вопрос:

Мое требование — загрузить файлы, поступившие в корневой каталог за последние 24 часа.

Приведенный ниже код работает в подкаталоге (скажем ftp.cwd («/Landing/»), но вызывает ошибку, когда я перехожу в корневой каталог.

 filematch='*.csv'
ftp.cwd("/")
for file_data in ftp.mlsd(filematch):
    file_name,meta = file_data
    last_modified = datetime.strptime(meta.get("modify"), "%Y%m%d%H%M%S")
    
    if (last_modified) >= now- timedelta(hours=0, minutes=1440):                   
        print(last_modified)
        local_filename = os.path.join('C:\Work\', file_name)
        file = open(local_filename, 'wb')
        with open(local_filename, "wb") as file:
            ftp.retrbinary(f"RETR {file_name}", file.write)
  

Если я меняю значение >= на == , то оно работает в корневом каталоге (но оба условия в порядке в подкаталоге; проблема только в корне)

if (last_modified) = now- timedelta(hours=0, minutes=1440):

Сообщение об ошибке:-

Файл «C:Program Файлы WindowsAppsPythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0libftplib.py «, строка 425, в retrbinary с self.transfercmd(cmd, rest) как conn: File «C:Program Файлы WindowsAppsPythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0libftplib.py «, строка 382, в transfercmd возвращает файл self.ntransfercmd(cmd, rest)[0] «C:Program Файлы WindowsAppsPythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0libftplib.py «, строка 348, в файле ntransfercmd resp = self.sendcmd(cmd) «C:Program Файлы WindowsAppsPythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0libftplib.py «, строка 275, в файле sendcmd return self.getresp() «C:Program Файлы WindowsAppsPythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0libftplib.py «, строка 248, в getresp вызывает error_perm(соответственно) ftplib.error_perm: 550 Отказано в разрешении.

Комментарии:

1. «Отказано в разрешении» означает, что вам не разрешено читать этот каталог.

2. Привет, я могу загружать файлы, когда я ставлю if (last_modified) == now- timedelta (часы = 0, минуты = 1440): но когда я ставлю «>=» вместо == тогда возникает только проблема с разрешением.

Ответ №1:

Эта проблема была исправлена.

основная причина:-

1>

 filematch='*.csv'
ftp.cwd("/")
for file_data in ftp.mlsd(filematch):
  

приведенный выше код получит список всего, несмотря на то, что тип файла указан как csv.

Примечание ** LIST() не работает на FTP

как только список и каталог будут доступны, он попытается записать файлы с помощью retrbinanary и будет поддерживать только файлы, а не каталог

 ftp.retrbinary(f"RETR {file_name}", file.write)
  

поэтому просто поставьте еще одно условие в операторе if и выберите только файл.

 Condition meta([type])=="file"