繁体   English   中英

Python FTP 检索中断 FOR 循环。 我用 try-catch 块修复了它。 为什么它有效?

[英]Python FTP retrieve breaks the FOR loop. I fixed it with try-catch block. Why does it work?

我正在通过 FTP 协议连接到我工作场所的一些机器人,以自动收集备份数据。 脚本应遍历所有文件夹并下载其中的所有文件。 但是,当我运行下面的代码时,python 脚本for folder in Folder_List:第一次迭代后循环。 这很奇怪,因为当我试图通过在终端中输入这些命令来查看导致错误的原因时,一切都没有错误。

在这里评论部分代码后,我发现ftp.retrbinary('RETR '+ filename, file.write)导致循环中断。 在机器人操作系统中,父文件夹是“/ROBOT”,其他文件夹在里面是这样的:“/ROBOT/JOB”或“/ROBOT/DAT”

from ftplib import FTP
import os
import os.path

try:
    ftp = FTP('192.10.100.1')
    ftp.login('user', 'password')
    ftp.getwelcome()
    ftp.cwd('ROBOT/')

    save_dir_full = '/home/mint/Documents/robot_data'
    Folder_List = ftp.nlst()
    # Folder_List should be similar to this: 
    # Folder_List = ['JOB', 'DAT', 'CND', 'SYS', 'PRM', 'LST', 'CSV', 'LOG']

    for folder in Folder_List:
        if not(os.path.exists(save_dir_full +'/'+folder)):
            try:
                os.makedirs(save_dir_full +'/'+folder)
            except:
                #print('directory already exists')
                pass
        ftp.cwd(folder)
        filenames = ftp.nlst() # get filenames within the directory
        for filename in filenames:
            local_filename = os.path.join(save_dir_full +'/'+folder+'/'+ filename)
            file = open(local_filename, 'wb')

            # THERE \/
            ftp.retrbinary('RETR '+ filename, file.write)

            file.close()
            print(filename)
                
        ftp.cwd('..')

    ftp.quit()
                
except:
    print('Could not connect to ftp device')

添加 try 块后,循环没有中断,程序成功完成:

try:
    ftp.retrbinary('RETR '+ filename, file.write)
except:
    pass

你知道它为什么有效吗?

你知道它为什么有效吗?

首先要做的是仔细看看发生了什么,为此,替换:

try:
    ftp.retrbinary('RETR '+ filename, file.write)
except:
    pass

try:
    ftp.retrbinary('RETR '+ filename, file.write)
except Exception as e:
    print(e)

并观察您的代码会生成什么。 作为 bare except更一般的注意用法,不建议在 python 中使用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM