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

  • 2019-04-12 17:32:11
  • 开发
  • 25
  • shevechco

使用python循环下载FTP文件列表报错,错误提示是这样的

01.
AttributeError: 'NoneType' object has no attribute 'sendall'

我的代码是这样

01.
#!/usr/bin/python3
02.
#coding:utf-8
03.
from ftp_server import FtpServer
04.
from log import info_output,error_output,warning_output
05.
from common import save_sessionid,load_json
06.
import json
07.
import requests
08.
import hashlib
09.
import time
10.
import os
11.
config = load_json()
12.
file_list_done = "file.list"
13.
isExists = os.path.exists(config['local_dir'])
14.
if not isExists:
15.
    os.makedirs(config['local_dir'], mode=0o777)
16.
ftp_operation = FtpServer(config['ftp_host'], config['ftp_user'], config['ftp_pass'], config['ftp_port'])
17.
ftp_file_list = ftp_operation.listRemoteFile(config['remote_dir'])
18.
19.
data_dict_list = []
20.
for p in ftp_file_list:
21.
    ftp_operation = FtpServer(config['ftp_host'], config['ftp_user'], config['ftp_pass'], config['ftp_port'])
22.
    ftp_operation.downloadRemoteFile(config['local_dir'], config['remote_dir'], p)
23.
    try:
24.
        #读取文件内容拼接成字典组成的列表
25.
        with open(config['local_dir']+p, "r", encoding="utf-8") as f:
26.
            while True:
27.
                line = f.readline()
28.
                line = line.strip("\n")
29.
                if not line:
30.
                    break
31.
                else:
32.
                    data_list = line.split("|")
33.
                    timearray = time.strptime(data_list[4].strip('"'), "%Y-%m-%d %H:%M:%S")
34.
                    createtime = int(time.mktime(timearray))
35.
                    data_dict_list.append({"record_id":data_list[3].strip('"'), "timestamp":createtime, "device_id":data_list[0].strip('"'), "imsi":data_list[5].strip('"')})
36.
        #将已经读取过的文件名写入file.list列表,防止重复读取
37.
        with open(file_list_done, "a+", encoding="utf-8") as g:
38.
            g.write(p+"\n")
39.
    except Exception as e:
40.
        error_output(e)
41.
    
42.
for p in data_dict_list:
43.
    with open("a.json", "a+", encoding="utf-8") as g:
44.
        g.write(json.dumps(p)+"\n")

然后再stackoverflow上找到了类似的问题,出现问题的原因我揣测如下

都英语,我英语不好,大概意思是在for循环中,下载文件以后会断开FTP服务器,然后再下一次循环中,需要重新创建FTP对象来连接FTP服务器,所以在上述代码中我们需要在下载文件的时候再一次创建FTP对象

在for循环中第一行添加一个

01.
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/640

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

转载注明出处:http://www.sulao.cn/post/644

相关推荐