一个简单的任务,使用python从ftp拉取txt文件再导入数据库,涉及的模块知识有ftp登录及下载,读取文件列表里的txt文件,以及pandas.dataframe.to_sql插入数据库的知识。
一、ftp登录及下载
读取ftp服务器文件,需要下载到文件打开才能读取。
from ftplib import FTP
def ftpconnect(host, username, password):
ftp = FTP()
# ftp.set_debuglevel(2) #打开调试级别2,显示详细信息
ftp.connect(host, 21) # 连接
ftp.login(username, password) # 登录,如果匿名登录则用空串代替即可
return ftp
def downloadfile(ftp, remotepath, localpath):
bufsize = 1024 # 设置缓冲块大小
fp = open(localpath, "wb") # 以写模式在本地打开文件
ftp.retrbinary("RETR " + remotepath, fp.write, bufsize) # 接收服务器上文件并写入本地文件
ftp.set_debuglevel(0) # 关闭调试
fp.close() # 关闭文件
def uploadfile(ftp, remotepath, localpath):
bufsize = 1024
fp = open(localpath, "rb")
ftp.storbinary("STOR " + remotepath, fp, bufsize) # 上传文件
ftp.set_debuglevel(0)
fp.close()
def listfile(ftp, remotepath):
list = ftp.nlst() # 获取目录下的文件,获得目录列表
for name in list:
print(name)
mdtm = ftp.sendcmd("MDTM " + remotepath + name)
mdate = mdtm[4:12] # 修改日期
print(mdate)
这里附上ftp操作命令的解释
#ftp登陆连接
from ftplib import FTP #加载ftp模块
ftp=FTP() #设置变量
ftp.set_debuglevel(2) #打开调试级别2,显示详细信息
ftp.connect("IP","port") #连接的ftp sever和端口
ftp.login("user","password") #连接的用户名,密码
print ftp.getwelcome() #打印出欢迎信息
ftp.cmd("xxx/xxx") #进入远程目录
bufsize=1024 #设置的缓冲区大小
filename="filename.txt" #需要下载的文件
file_handle=open(filename,"wb").write #以写模式在本地打开文件
ftp.retrbinaly("RETR filename.txt",file_handle,bufsize) #接收服务器上文件并写入本地文件
ftp.set_debuglevel(0) #关闭调试模式
ftp.quit() #退出ftp
#ftp相关命令操作
ftp.cwd(pathname) #设置FTP当前操作的路径
ftp.dir() #显示目录下所有目录信息
ftp.nlst() #获取目录下的文件
ftp.mkd(pathname) #新建远程目录
ftp.pwd() #返回当前所在位置
ftp.rmd(dirname) #删除远程目录
ftp.delete(filename) #删除远程文件
ftp.rename(fromname, toname)#将fromname修改名称为toname。
ftp.storbinaly("STOR filename.txt",file_handel,bufsize) #上传目标文件
ftp.retrbinary("RETR filename.txt",file_handel,bufsize) #下载FTP文件
二、读取文件列表里的txt文件
import os
def readtxt():
path = r"./file/txt/"
rows = []
names = os.listdir(path) # 获取列表
for name in names:
with open(path + name, "r", encoding="utf-8") as f:
for ann in f.readlines(): # 按行读取
ann = ann.strip("\n") # 去除文本中的换行符
三、pandas.dataframe.to_sql插入数据库
class db:
def __init__(self):
self.engine = create_engine(
"mysql+pymysql://root:[email protected]:3306/db"
)
# 此处做了2次去重
def insert(self, rows, columns):
# 需加入columns,否则数据插入会更改表字段。
df = pd.DataFrame(rows, columns=columns)
# 1、导入的列表里,按id删除重复项
df = df.drop_duplicates(subset=["id"])
num_rows = len(df)
for i in range(num_rows):
try:
# 2、使用逐条插入,而不用批量插入,用try-except判断避免重复插入的异常
# Try inserting the row
df.iloc[i : i + 1].to_sql(
"tablename", if_exists="append", index=False, con=self.engine
)
except:
pass