注:仅为笔记
1、Python ftp连接,下载文件
def ftpDownload() : #创建ftp对象实例 ftp = FTP() ftp.connect(FTPip, FTPPORT) #通过账号和密码登录FTP服务器 ftp.login(USERNAME,USERPWD) #如果参数 pasv 为真,打开被动模式传输 (PASV MODE) , #否则,如果参数 pasv 为假则关闭被动传输模式。 #在被动模式打开的情况下,数据的传送由客户机启动,而不是由服务器开始。 #这里要根据不同的服务器配置# ftp.set_pasv(0) #在FTP连接中切换当前目录 # CURRTPATH= "/home1/ftPRoot/ybmftp/testupg/payment"# ftp.cwd(CURRTPATH) #为准备下载到本地的文件,创建文件对象 f = open(DownLocalFilename, 'wb') #从FTP服务器下载文件到前一步创建的文件对象,其中写对象为f.write,1024是缓冲区大小 ftp.retrbinary('RETR ' + DownRoteFilename , f.write , 1024) #关闭下载到本地的文件 #提醒:虽然Python可以自动关闭文件,但实践证明,如果想下载完后立即读该文件,最好关闭后重新打开一次 f.close() #关闭FTP客户端连接 ftp.close()2、日期字符串生成,拼装文件名称
def getYesterday() : now = datetime.datetime.now() date = now + datetime.timedelta(days = -1) return date.strftime('%Y%m%d')3、csv文件读取
file_zip = zipfile.ZipFile(DownRoteFilename,'r') for file in file_zip.namelist(): file_zip.extract(file,r'.') with codecs.open(file,'rb','utf-8') as csvfile: # with open(file,'rb') as csvfile: spamreader = csv.reader(csvfile) line_num = 0 L1 = [] for row in spamreader: line_num=line_num+1; if line_num ==7 : #print ', '.join(row) #存放字段前先清空 #SQL_FILEDS =[] for s in row: print s.decode('utf-8') SQL_FILEDS.append(s) if line_num >7 and len(row) > 1 : #print ', '.join(row) L1.append(row)# print L1 #达到批量处理行数之后批量入库 if len(L1) >=BATCH_LINE : MySQL_database(L1) L1 =[] #测试时候只读取几行 #if line_num >10 : # break print line_num #循环读取数据结束,处理剩余未达到批量处理的数组对象 if len(L1) >0 : mysql_database(L1) L1 =[] #删除解压后文件 os.remove(file)注意中文编码问题,4、mysql数据插入
def mysql_database(L1): conn = MySQLdb.connect(host='localhost', user='root',passwd='***',charset="utf8") cursor = conn.cursor() conn.select_db('mask_data') #for row in L1 : # print row #print SQL_FILEDS sql_parm='' for s in SQL_FILEDS : sql_parm +='%s,' sql = 'insert into test1 VALUES ('+sql_parm[:-1]+') ' print sql print len(L1) cursor.executemany(sql,L1) #test_all_count = int(cursor.rowcount) #test_all = cursor.fetchall() conn.commit() cursor.close() conn.close() 需要留意中文编码,conn = MySQLdb.connect(host='localhost', user='root',passwd='***',charset="utf8")如果不指定编码会默认编码,导致中文乱码。完成脚本:
# -*- coding: utf-8 -*-#!/usr/bin/env python##Author: Liu6import zipfileimport csvimport codecs import MySQLdbimport datetimeimport osfrom ftplib import FTPimport codecs #import pandas as pdimport sysreload(sys)sys.setdefaultencoding('utf-8')def getYesterday() : now = datetime.datetime.now() date = now + datetime.timedelta(days = -1) return date.strftime('%Y%m%d')dateStr = getYesterday()print dateStr#测试使用的字符串dateStr = '20170102'DownRoteFilename='provincePayDay_Zz-'+dateStr+'080300.zip'DownLocalFilename = DownRoteFilenameSQL_FILEDS = []#设置批量处理数据数量BATCH_LINE = 10000#指定IP地址和端口,账号密码信息FTPIP= "127.0.0.1"FTPPORT= 21USERNAME= "test"USERPWD= "test"encoding='utf-8'def ftpDownload() : #创建ftp对象实例 ftp = FTP() ftp.connect(FTPIP, FTPPORT) #通过账号和密码登录FTP服务器 ftp.login(USERNAME,USERPWD) #如果参数 pasv 为真,打开被动模式传输 (PASV MODE) , #否则,如果参数 pasv 为假则关闭被动传输模式。 #在被动模式打开的情况下,数据的传送由客户机启动,而不是由服务器开始。 #这里要根据不同的服务器配置# ftp.set_pasv(0) #在FTP连接中切换当前目录 # CURRTPATH= "/home1/ftproot/ybmftp/testupg/payment"# ftp.cwd(CURRTPATH) #为准备下载到本地的文件,创建文件对象 f = open(DownLocalFilename, 'wb') #从FTP服务器下载文件到前一步创建的文件对象,其中写对象为f.write,1024是缓冲区大小 ftp.retrbinary('RETR ' + DownRoteFilename , f.write , 1024) #关闭下载到本地的文件 #提醒:虽然Python可以自动关闭文件,但实践证明,如果想下载完后立即读该文件,最好关闭后重新打开一次 f.close() #关闭FTP客户端连接 ftp.close()def mysql_database(L1): conn = MySQLdb.connect(host='localhost', user='root',passwd='***',charset="utf8") cursor = conn.cursor() conn.select_db('mask_data') #for row in L1 : # print row #print SQL_FILEDS sql_parm='' for s in SQL_FILEDS : sql_parm +='%s,' sql = 'insert into test1 VALUES ('+sql_parm[:-1]+') ' print sql print len(L1) cursor.executemany(sql,L1) #test_all_count = int(cursor.rowcount) #test_all = cursor.fetchall() conn.commit() cursor.close() conn.close()def readCSVFile() : file_zip = zipfile.ZipFile(DownRoteFilename,'r') for file in file_zip.namelist(): file_zip.extract(file,r'.') with codecs.open(file,'rb','utf-8') as csvfile: # with open(file,'rb') as csvfile: spamreader = csv.reader(csvfile) line_num = 0 L1 = [] for row in spamreader: line_num=line_num+1; if line_num ==7 : #print ', '.join(row) #存放字段前先清空 #SQL_FILEDS =[] for s in row: print s.decode('utf-8') SQL_FILEDS.append(s) if line_num >7 and len(row) > 1 : #print ', '.join(row) L1.append(row)# print L1 #达到批量处理行数之后批量入库 if len(L1) >=BATCH_LINE : mysql_database(L1) L1 =[] #测试时候只读取几行 #if line_num >10 : # break print line_num #循环读取数据结束,处理剩余未达到批量处理的数组对象 if len(L1) >0 : mysql_database(L1) L1 =[] #删除解压后文件 os.remove(file)ftpDownload()readCSVFile()#删除ftp上下载的文件#os.remove(DownLocalFilename)
新闻热点
疑难解答