Python 读取csv文件批量入库Mysql

注:仅为笔记

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: Liu6
import zipfile
import csv
import codecs 
import MySQLdb
import datetime
import os
from ftplib import FTP
import  codecs 
#import pandas as pd
import sys

reload(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 = DownRoteFilename

SQL_FILEDS =  []

#设置批量处理数据数量
BATCH_LINE = 10000
#指定IP地址和端口,账号密码信息
FTPIP= "127.0.0.1"
FTPPORT= 21
USERNAME= "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)
					

			
			






你可能感兴趣的:(笔记)