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)
行导致循环中断。
在机器人 os 中,父文件夹是“/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)
并观察您的代码会生成什么。作为更一般的注意用法,裸 except
、is not recommended in python.
我正在通过 FTP 协议连接到我工作场所的一些机器人,以自动收集备份数据。脚本应遍历所有文件夹并下载其中的所有文件。但是,当我 运行 下面的代码时, python 脚本在第一次迭代后离开 for folder in Folder_List:
循环。
这很奇怪,因为当我试图通过在终端中输入这些命令来查看导致错误的原因时,一切都顺利进行了。
在此处注释部分代码后,我发现 ftp.retrbinary('RETR '+ filename, file.write)
行导致循环中断。
在机器人 os 中,父文件夹是“/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)
并观察您的代码会生成什么。作为更一般的注意用法,裸 except
、is not recommended in python.