首页 > 解决方案 > 从最近 n 小时更新的 FTP 服务器下载文件

问题描述

我的要求是下载过去 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 Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\ftplib.py”,第 425 行,以 self.transfercmd(cmd,rest) 作为 conn 的 retrbinary:文件“C:\ Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\ftplib.py”,第 382 行,在 transfercmd 返回 self.ntransfercmd(cmd, rest)[0] 文件“C:\Program Files\WindowsApps\ PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\ftplib.py”,第 348 行,在 ntransfercmd resp = self.sendcmd(cmd) 文件“C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776. 0_x64__qbz5n2kfra8p0\lib\ftplib.py”,第 275 行,在 sendcmd 返回 self.getresp() 文件“C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776。0_x64__qbz5n2kfra8p0\lib\ftplib.py",第 248 行,在 getresp 中引发 error_perm(resp)ftplib.error_perm:550 权限被拒绝。

标签: pythonftpftplib

解决方案


这个问题已被解决。

根本原因:-

1>

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

尽管将文件类型设置为 csv,但上面的代码将获取所有内容的列表。

注意 ** LIST() 在 FTP 中不起作用

一旦列表和目录可用,它将尝试使用 retrbinanary 写入文件,它将仅支持文件而不是 dir

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

所以只需在 if 语句中再添加一个条件并仅选择文件。

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

推荐阅读