#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"