csv文件通常存在如下问题: 1. 文件过大(需要进行文件分割)
2. 列异常(列不一致,如元数据列为10列,但csv文件有些行是11列,或者4列)
本脚本用于解决此问题。
#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 ‘‘‘ import os,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)): pass count += 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("请输入要分割成的文件数:") if strContentInput.isdigit(): contentInput=int(strContentInput) else: print("★ : 您输入的 "+strContentInput+" 不是数字 ! ",file=sys.stderr) print("★ : 您输入的 "+strContentInput+" 不是数字 ! ",file=file3) # 退出脚本 sys.exit() print("分割成的文件数:"+strContentInput) print("分割成的文件数:"+strContentInput,file=file3) splitLineCount=count//contentInput print("每文件行数:"+str(splitLineCount)) print("每文件行数:"+str(splitLineCount),file=file3) # 可以用一个list包含文件对象列表 # 源文件名-正确列-文件序号.csv fileList=[] fileIndex=0 print("分割后的文件名:") print("分割后的文件名:",file=file3) while fileIndex < contentInput: filetmpname=fileName+‘-正确列-‘+str(fileIndex)+fileExt print(" "+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 in spamreader: # 列数为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() del file2 file3.close() del file3 fileIndex=0 while fileIndex < contentInput: fileList[fileIndex].close() fileIndex=fileIndex+1 # 删除整个fileList del fileList
原文:http://www.cnblogs.com/weiqi/p/6230464.html