python处理csv文件列错位_CSV文件分割与列异常处理的python脚本

#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

你可能感兴趣的:(python处理csv文件列错位_CSV文件分割与列异常处理的python脚本)