首页 > 学院 > 操作系统 > 正文

Python 读取csv文件批量入库Mysql

2024-06-28 16:00:35
字体:
来源:转载
供稿:网友

注:仅为笔记

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)											


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表