注:仅为笔记
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)