#coding=utf-8
‘‘‘脚本说明
用来解决csv文件的列异常问题(以逗号分隔符为例):
csv文件有些列含有换行符、逗号等特殊符号,这就导致csv文件出现列异常的情况。
此脚本将csv文件输出成如下文件:源文件名-正确列-文件序号.csv 源文件名-错误列.csv 源文件名-info.txt
常用文本编码: gbk,gb2312,utf-8,utf-8_sig
★:因为没有实现文本编码转换,所以“输入文件编码”和“输出文件编码”要写成一致才行,其中输入文件编码必须正确
不知道为什么有些gbk输入文件会报错:
for count,line in enumerate(open(fileName+fileExt,‘rU‘,encoding=inFileEncoding)):
UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xf8 in position 5902: illegal multibyte sequence
解决办法:
使用powershell转换格式成utf-8,然后在使用本脚本来处理。其中powershell转换格式的代码如下:
Get-Content -path .\2014.csv|Out-File .\2014-1.csv -Encoding "utf-8"‘‘‘
#单行注释
‘‘‘多行注释:
取模运算:
if a % b == 0 :
print ‘yes‘
else:
print ‘no‘
整除语法: 2//1‘‘‘
importos,csv,sys
fileName=‘2013-1‘fileExt=‘.csv‘
#输入文件编码
inFileEncoding=‘utf-8‘
#输出文件编码
outFileEncoding=‘utf-8‘
#行号
rowscount=1
#分隔符号
delimiterChar=‘,‘rowLength=0#分割后文件名开始编号
filecount=0#计算文件总行数
count=-1
for count,line in enumerate(open(fileName+fileExt,‘rU‘,encoding=inFileEncoding)):passcount+= 1
#源文件名-info.txt
filename3=fileName+‘-info‘+‘.txt‘file3=open(filename3,‘w+‘,encoding=‘utf-8‘)
statinfo=os.stat(fileName+fileExt)print("\n文件名称:"+ fileName+fileExt)print("\n文件名称:"+ fileName+fileExt,file=file3 )print("文件行数:"+str(count) )print("文件行数:"+ str(count),file=file3 )print("文件大小:"+ str(statinfo.st_size//1024//1024)+"M")print("文件大小:"+ str(statinfo.st_size//1024//1024)+"M",file=file3)
strContentInput=input("请输入要分割成的文件数:")ifstrContentInput.isdigit():
contentInput=int(strContentInput)else:print("★ : 您输入的"+strContentInput+"不是数字 !",file=sys.stderr)print("★ : 您输入的"+strContentInput+"不是数字 !",file=file3)#退出脚本
sys.exit()print("分割成的文件数:"+strContentInput)print("分割成的文件数:"+strContentInput,file=file3)
splitLineCount=count//contentInputprint("每文件行数:"+str(splitLineCount))print("每文件行数:"+str(splitLineCount),file=file3)#可以用一个list包含文件对象列表#源文件名-正确列-文件序号.csv
fileList=[]
fileIndex=0print("分割后的文件名:")print("分割后的文件名:",file=file3)while fileIndex
filetmpname=fileName+‘-正确列-‘+str(fileIndex)+fileExtprint(" "+filetmpname)print(" "+filetmpname,file=file3)
filetmp=open(filetmpname,‘w+‘,encoding=outFileEncoding)
fileList.append(filetmp)
fileIndex=fileIndex+1
#源文件名-错误列.csv
filename2=fileName+‘-错误列‘+fileExt
file2=open(filename2,‘w+‘,encoding=outFileEncoding)print("分割后的文件名(列异常数据):")print("分割后的文件名(列异常数据):",file=file3)print(" "+filename2)print(" "+filename2,file=file3)
with open(fileName+‘.csv‘,newline=‘‘,encoding=inFileEncoding) as csvfile:
spamreader=csv.reader(csvfile,delimiter=delimiterChar)for line inspamreader:#列数为0时,读取第一行作为准确的列数。
if ( rowLength ==0 ):
rowLength=len(line)#列数不为0时,当前行的列数与其匹配,将匹配的和不匹配的保存到不同的文件。
else:if ( rowLength ==len(line) ):#输出到对应文件序号的文件中: 行数“整除”分割行数
if ( rowscount//splitLineCount > len(fileList)-1):print((‘,‘.join(line)),file=fileList[len(fileList)-1])else:print((‘,‘.join(line)),file=fileList[rowscount//splitLineCount])else:print((‘,‘.join(line)),file=file2)
rowscount=rowscount+1
#关闭文件
file2.close()delfile2
file3.close()delfile3
fileIndex=0while fileIndex
fileList[fileIndex].close()
fileIndex=fileIndex+1
#删除整个fileList
del fileList