使用python循环下载FTP文件列表报错,错误提示是这样的
AttributeError: 'NoneType' object has no attribute 'sendall'
我的代码是这样
#!/usr/bin/python3 #coding:utf-8 from ftp_server import FtpServer from log import info_output,error_output,warning_output from common import save_sessionid,load_json import json import requests import hashlib import time import os config = load_json() file_list_done = "file.list" isExists = os.path.exists(config['local_dir']) if not isExists: os.makedirs(config['local_dir'], mode=0o777) ftp_operation = FtpServer(config['ftp_host'], config['ftp_user'], config['ftp_pass'], config['ftp_port']) ftp_file_list = ftp_operation.listRemoteFile(config['remote_dir']) data_dict_list = [] for p in ftp_file_list: ftp_operation = FtpServer(config['ftp_host'], config['ftp_user'], config['ftp_pass'], config['ftp_port']) ftp_operation.downloadRemoteFile(config['local_dir'], config['remote_dir'], p) try: #读取文件内容拼接成字典组成的列表 with open(config['local_dir']+p, "r", encoding="utf-8") as f: while True: line = f.readline() line = line.strip("\n") if not line: break else: data_list = line.split("|") timearray = time.strptime(data_list[4].strip('"'), "%Y-%m-%d %H:%M:%S") createtime = int(time.mktime(timearray)) data_dict_list.append({"record_id":data_list[3].strip('"'), "timestamp":createtime, "device_id":data_list[0].strip('"'), "imsi":data_list[5].strip('"')}) #将已经读取过的文件名写入file.list列表,防止重复读取 with open(file_list_done, "a+", encoding="utf-8") as g: g.write(p+"\n") except Exception as e: error_output(e) for p in data_dict_list: with open("a.json", "a+", encoding="utf-8") as g: g.write(json.dumps(p)+"\n")
然后再stackoverflow上找到了类似的问题,出现问题的原因我揣测如下
都英语,我英语不好,大概意思是在for循环中,下载文件以后会断开FTP服务器,然后再下一次循环中,需要重新创建FTP对象来连接FTP服务器,所以在上述代码中我们需要在下载文件的时候再一次创建FTP对象
在for循环中第一行添加一个
ftp_operation = FtpServer(config['ftp_host'], config['ftp_user'], config['ftp_pass'], config['ftp_port'])
这样就好了。
但是这样我感觉还是怪怪的,我上面明明创建了FTP对象,在FTP类中也没有ftp.close()或者ftp.quit()操作,为什么非要再次创建FTP对象,才能循环下载FTP文件成功,有点想不通啊
搞笑了,在类的方法里面try里面关闭了,单独写了个ftp.close()用上就好了。。。太粗心了,直接查看修改好的FTP类吧:https://sulao.cn/post/643.html