三月阳光 发表于 2018-8-6 10:07:42

python cvs文件处理脚本 python csv

#!/usr/bin/env python  
#coding=utf-8
  

  
from itertools import izip
  
import urllib,urllib2,urllib2,json,csv,sys,time,chardet
  

  
csv_file=sys.argv
  

  
#定义需要导入的列,无顺序
  
Check_Head=("name","phone","isSell","origin","type","city","brand","series","model","year","plate" ,"remark")
  

  
##values 为True的表示不可以为空,为False的可以为空
  
keys={"name":True,"phone":True,"isSell":True,"origin":True,"type":False,"city":False,"brand":False,"series":False,"model":False,"year":False,"plate":False ,"remark":False}
  

  

  
#post
  
def http_post(data,url):
  jdata = json.dumps(data)
  req = urllib2.Request(url, jdata)
  response = urllib2.urlopen(req)
  return response.read()
  

  

  
#获取需要处理的csv文件的字符编码
  
def Codeing(file):
  try:
  f = open( file, 'rb' )
  fencoding=chardet.detect(f.read())
  f.close()
  return fencoding["encoding"]
  except Exception,err:
  print Exception, ":","%s" % err
  sys.exit()
  
decode=Codeing(csv_file)
  
encode= sys.stdin.encoding
  
###导入询问
  
def Export_Inquiry():
  while True :
  YS=raw_input("确认导入请输入Y,退出请输入N :".decode('utf-8').encode(encode)).strip()
  if YS == "Y":
  break
  elif YS == "N":
  sys.exit()
  print u"已开始导入,导入过程中请勿退出!"
  

  
#导入环境配置
  
def Export_Env():
  while True :
  export_env=raw_input("请输入导入环境prod/uat ? :".decode('utf-8').encode(encode)).strip()
  if export_env == "prod":
  url='http://www.xxxxx.com/webapi/public/register_carneed'
  print u"你要导入的是生产环境,请确认是否需要导入 ?"
  returnurl
  elif export_env == "uat":
  print u"你要导入的是UAT环境,请确认是否需要导入 ?"
  url='http://uat.xxxx.com/webapi/public/register_carneed'
  returnurl
  

  

  

  
def Check_Csv(csv_file,Head,coding):
  suffix=csv_file.split(".")[-1]
  if suffix != "csv":
  sys.exit("请输入csv文件")
  try:
  f = open( csv_file, 'rb' )
  except Exception,err:
  print Exception, ":","%s" % err
  sys.exit()
  reader = csv.reader( f )
  loop=0
  for row in reader:
  if reader.line_num == 1:
  if len(row) != len(Head):
  print u"请检查你的csv文件列数与要求不一致;"
  print u"你导入为%s 列:%s" % (len(row),row)
  print u"正确应该%s 列:%s" % (len(Head),list(Head))
  sys.exit()
  err_head=[]
  list_head=[]
  for li in row:
  li=li.strip().decode(coding)
  if li not in Head:
  err_head +=
  else:
  list_head +=
  if err_head:
  print u"列名有误:%s 请确认是否与以下匹配" % err_head
  #print "正确请参考如下列名:"
  printlist(Head)
  sys.exit()
  list_head=tuple(list_head)
  continue
  else:
  if len(row) == 0 :##去除空行
  print u"第%s行为空,请处理" %reader.line_num
  sys.exit()
  row = iter( row )##放入迭代器
  out={}
  for key in list_head:
  out = row.next().strip().decode(coding).encode("UTF-8") ##根据前面获取的字符编码解码
  data = out
  IsNull_Key={}
  for (k,v) in keys.items():##检查不能为空的字段的值是否为空,如果为空,则记录下并告诉行号!
  if v is True:
  if data == "":
  IsNull_Key=data
  if IsNull_Key:
  print u"第%s行有空值:%s" % (reader.line_num , IsNull_Key)
  loop += 1
  result={"loop":loop,"list_head":list_head}
  return result
  f.close()
  

  
def Import_Csv(csv_file,list_head,url,coding):
  f = open( csv_file, 'rb' )
  reader = csv.reader( f )
  for row in reader:
  if reader.line_num == 1:
  continue
  else:
  row = iter( row )
  out={}
  for key in list_head:
  out = row.next().strip().decode(coding).encode("UTF-8")##根据前面获取的字符编码解码
  data = out
  for (k,v) in keys.items():
  if v is False:
  if data == "":
  del data
  

  try:
  if reader.line_num % 2 == 0:
  time.sleep(1)
  resp=http_post(data=data,url=url)
  result=json.loads(resp)
  
#result["success"]=False
  if result["success"] is False:
  print u"请注意:第%s行导入失败! %s " % (reader.line_num,resp)
  else:
  print u"成功导入第%s行:%s" % (reader.line_num,resp)
  except Exception,err:
  print Exception, ":","%s" % err
  sys.exit()
  

  f.close()
  print u"导入已完成,共导入%s行。"% (reader.line_num - 1)
  

  

  

  
print "############################################"
  
print u"###正在校验csv文件格式,请稍等.........#####"
  
print "############################################"
  

  

  
result=Check_Csv(csv_file,Check_Head,decode)
  
loop=result["loop"]
  
list_head=result["list_head"]
  
if loop > 0:
  print u"请按以上提示处理后再进行导入!"
  sys.exit()
  
else:
  print u"文件格式校验已完成,请选择导入环境:"
  url=Export_Env()
  Export_Inquiry()
  Import_Csv(csv_file,list_head,url,decode)
  

  
print "############################################"
  
print u"################导入完成!##################"
  
print "############################################"
页: [1]
查看完整版本: python cvs文件处理脚本 python csv