首页 > 编程语言 > 详细

CSV文件分割与列异常处理的python脚本

时间:2016-12-28 21:19:08      阅读:216      评论:0      收藏:0      [点我收藏+]

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

 

CSV文件分割与列异常处理的python脚本

原文:http://www.cnblogs.com/weiqi/p/6230464.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!