python从ftp拉取文件再导入数据库

一个简单的任务,使用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

你可能感兴趣的:(python,python,开发语言)