Python使用FTP模块循环下载文件列表报错的解决方法

使用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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/647.html

我要评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。