注:僅為筆記
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)
新聞熱點
疑難解答