zoukankan      html  css  js  c++  java
  • Python学习 第9天 连接FTP和数据库

    公司项目刚好有个小需求,要遍历FTP文件夹下的图片,并写进数据库,非常适合练手

    从网上找了一段代码,改造了一下

    中文是个大坑

    #encoding=utf-8
    from ftplib import FTP
    import os, sys, string, datetime, time, socket, pymssql
    import _mssql
    import uuid
    import decimal
    reload(sys)
    sys.setdefaultencoding('utf8')
    
    class MYFTP:
        def __init__(self, hostaddr, username, password, remotedir, port=21):
            self.hostaddr = hostaddr
            self.username = username
            self.password = password
            self.remotedir = remotedir
            self.port = port
            self.ftp = FTP()
            self.file_list = []
        def __del__(self):
            self.ftp.close()
        def login(self):
            ftp = self.ftp
            timeout = 300
            socket.setdefaulttimeout(timeout)
            ftp.set_pasv(True)
            ftp.connect(self.hostaddr, self.port)
            ftp.login(self.username, self.password)
            print u'成功登录到 %s' % (self.hostaddr)
            ftp.cwd(self.remotedir)
    
        def list_files(self, caseId, docCaseId, remotedir='./'):
            self.ftp.cwd(remotedir)
            print(u'正在处理目录 %s' % self.ftp.pwd())
            self.file_list = []
            self.ftp.dir(self.get_file_list)
            for item in self.file_list:
                sql_str.append('''
                INSERT INTO XXX( OrderID, CaseID, DocCaseID, EvidenceName, Amount, Page, TotalPage, FilePath, FileName, Remark)
                VALUES ('%s', '%s', '%s', '%s', '1', '1', '1', '%s', '%s', '%s');
                ''' % (self.file_list.index(item) + 1, caseId.encode("UTF-8"), docCaseId.encode("UTF-8"),
                      item[1].split('.')[0], remotedir.encode("UTF-8"), item[1], "FROM FTP"))
    
        def get_file_list(self, line):
            ret_arr = []
            file_arr = self.get_filename(line)
            if file_arr[1] not in ['.', '..']:
                self.file_list.append(file_arr)
                
        def get_filename(self, line):
            pos = line.rfind(':')
            while(line[pos] != ' '):
                pos += 1
            while(line[pos] == ' '):
                pos += 1
            while(line[pos] != ' '):
                pos += 1
            while(line[pos] == ' '):
                pos += 1
            file_arr = [line[0], line[pos:]]
            return file_arr
    
    if __name__ == '__main__':
        try:
            conn = pymssql.connect(host='.',user='sa',password='XXX',database='XXX',charset='utf8')
            cur = conn.cursor()
            #先获取FTP配置
            cur.execute("SELECT ParamValue FROM XXX WHERE ParamName = 'FTP地址';")
            hostaddr = cur.fetchone()[0].encode("UTF-8") # ftp地址
            cur.execute("SELECT ParamValue FROM XXX WHERE ParamName = 'FTP用户名';")
            username = cur.fetchone()[0].encode("UTF-8") # 用户名
            cur.execute("SELECT ParamValue FROM XXX WHERE ParamName = 'FTP密码';")
            password = cur.fetchone()[0].encode("UTF-8") # 密码
            cur.execute("SELECT ParamValue FROM XXX WHERE ParamName = 'FTP端口';")
            port = cur.fetchone()[0].encode("UTF-8") # 端口号
        
            #测试用
            # hostaddr = "XXX" # ftp地址
            # username = "XXX" # 用户名
            # password = "XXX" # 密码
            # port = 21 # 端口号
    
            #连接FTP
            rootdir_remote = '' # 远程目录
            f = MYFTP(hostaddr, username, password, rootdir_remote, port)
            f.login()
    
            sql_str = []
            cur.execute('''
    USE XXX
    SELECT 'A'+ CONVERT(VARCHAR(50),hr.Id) CaseID, CONVERT(VARCHAR(50),hr.Id) DocCaseID, '/' + REPLACE(FilePath, '\','/') FilePath
    FROM XXX f
    JOIN  XXX hr ON hr.BussinessTypeID = f.BussinessTypeId AND hr.BussinessId = f.BussinessId 
    WHERE FilePath IS NOT NULL AND FilePath <> ''AND f.BussinessTypeId IN (1,2,3,5) 
        AND NOT EXISTS(SELECT * FROM XXX h WHERE h.BussinessTypeId = f.BussinessTypeId AND h.BussinessId = f.BussinessId)
        AND FilePath LIKE '%Owner%'
            ''')
            rows = cur.fetchall()
            for row in rows:
                f.list_files(row[0], row[1], row[2].replace("//","/"))
    
            #拼好的字符串一次性执行,如果update/delete/insert记得要conn.commit(),否则数据库事务无法提交
            #print(''.join(sql_str))
            #直接执行的话,其中有中文会报错,先输出到文本再手动执行了
            #cur.execute(''.join(sql_str))
            #conn.commit()
            f = file('result.sql','a+')
            f.writelines(''.join(sql_str))
            f.close()
    
            #关闭数据库连接
            cur.close()
            conn.close()
        except Exception as ex:
            print(ex)

    小结一下:

    1、语法不熟的话,第一次谈不上效率,每写一句都要查。。。各种报错各种问题,如果用C#控制台可能早就处理完了

    2、中文是个坑

    3、打包成exe又是个坑

    4、代码看着比较舒畅,但语法不熟,随便一个函数都要靠查和试

    5、就一个py文件比较干脆,又能处理FTP又能处理SQL,还能读写文件

    6、尝试一下可以,日常任务可能用不上,C#照样可以处理。可能侧重点不同,Python可能在处理爬虫、图形方面比较强悍

  • 相关阅读:
    每日英语:Universities in Singapore strengthen cooperation with China
    每日英语:The Exercise Equivalent of a Cheeseburger?
    每日英语:Eating Safely in China, on a Budget
    每日英语:What Makes A RiskTaker
    OAuth2 vs JWT,到底怎么选?
    Docker 为什么输给了Kubernetes?Docker 员工自述!
    90 岁程序员,他的压缩算法改变了世界!
    数据库设计的 10 个最佳实践!
    代码写的垃圾被嫌弃?这 3 个插件你值得拥有!
    ShardingJdbc 实现读写分离 + 分库分表,写得太好了!
  • 原文地址:https://www.cnblogs.com/liuyouying/p/7168226.html
Copyright © 2011-2022 走看看