csv文件容错处理方法

所属分类: 网络编程 / 其它综合 阅读数: 512
收藏 0 赞 0 分享

如果数据库有特殊字符(换行符,转义符),会导致生成的csv无法正常导入。

val1,val2,val3
aa,bb,cc
a
a,bb,cc
aa
,bb,cc
aa,
bb,cc
a\a,bb,cc

第一行header和第二行数据正常。
第三行第一个列有换行符,此时导致第四行看着正常(3列),但是数据又是错误的。
第五行跟第三行类似
第七行实际是第二个单元格首字符换行,导致第八行缺失一列。
第九行有转义符

处理成

val1,val2,val3
aa,bb,cc
aa,bb,cc
aa,bb,cc
aa,bb,cc
aa,bb,cc

利用空闲时间,用python写了个修补工具,原理是利用,csv是从上往下读的,如果前一行列数不够,一定可以从后一列补上。但是可能存在补完后超过指定列(比如列内包含分隔符,导致数据库3列,变成4列),所以需要对其切片,只保留指定列数。

clean_csv.py

# -*- coding: utf-8 -*-
# Author AnJia(anjia0532@gmail.com https://anjia0532.github.io)
import argparse
import sys, os
import io
reload(sys)
sys.setdefaultencoding('utf8')
black_dict={"\\":"","\"":""}
def main():
  parser = argparse.ArgumentParser()
  parser.add_argument('--cols', type=int, dest='cols', action='store', default=-1,help="count of columns,default first line's cells")
  parser.add_argument('--src', type=str, dest='src', action='store', default='',
            help='path to source csv file')
  parser.add_argument('--dest', type=str, dest='dest', action='store', default='',
            help='path to dest csv file')
  parser.add_argument('--encoding', type=str, dest='encoding', action='store', default='utf-8',
            help='file encoding,default utf-8')
  parser.add_argument('--chunksize', type=int, dest='chunksize', action='store', default='10000',
            help='batch lines to write dest file,default 10000')
  parser.add_argument('--delimiter', type=str, dest='delimiter', action='store', default=',',
            help='csv delimiter,default ,')
  args = parser.parse_args()
  cols = args.cols
  src = args.src
  dest = args.dest
  encoding = args.encoding
  chunksize = args.chunksize
  delimiter = args.delimiter
  if not (src and dest) or chunksize <= 0:
   print("invaild args!") 
   sys.exit(-1)
  olds=[]
  lines=[]
  with io.open(src,encoding=encoding) as fp:
   for line in fp.readlines():
    line = line.strip()
    for k,v in black_dict.items():
     if k in line:
      line=line.replace(k,v)
    cells = line.split(delimiter)
    if cols == -1:
     cols=len(cells)
    if(len(cells) < cols or (len(olds)>0 and len(olds) < cols)):
     if not olds:
      olds = cells
     else:
      cells[0]=olds[-1]+cells[0]
      olds.pop()
      olds.extend(cells)
    if len(olds) >= cols:
     cells=olds
     olds=[]
    if not olds:
     lines.append(delimiter.join(cells[0:cols])+"\n")
    if len(lines) % chunksize == 0:
     write_to_file(dest=dest,lines=lines)
     lines=[]
   write_to_file(dest=dest,lines=lines)
def write_to_file(dest,lines=[],encoding='utf-8'):
 p = os.path.split(dest)[0]
 if not os.path.exists(p):
  os.makedirs(p)
 with io.open(file=dest,mode="a+",encoding=encoding) as fp:
  fp.writelines(lines)
if __name__ == '__main__':
  main()

使用方式

python clean_csv.py --src=src.csv --dest=dest.csv --chunksize=50000 --cols --encoding=utf-8 --delimiter=,

以上所述是小编给大家介绍的csv文件容错处理方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

更多精彩内容其他人还在看

浅析mmdetection在windows10系统环境中搭建过程

这篇文章主要介绍了mmdetection在windows10系统环境中搭建过程,本文图文并茂通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

so easy!10行代码写个"狗屁不通"文章生成器功能

这篇文章主要介绍了通过10行代码写个"狗屁不通"文章生成器功能,真的超级简单,感兴趣的朋友跟随脚本之家小编一起看看吧
收藏 0 赞 0 分享

Python实现用户登录并且输入错误三次后锁定该用户

这篇文章主要介绍了Python实现用户登录并且输入错误三次后锁定该用户,文中通过c#代码给大家补充介绍了密码输入三次错误后锁定用户功能,需要的朋友可以参考下
收藏 0 赞 0 分享

jetbrains mono字体安装方法(推荐)

JetBrains 推出了一款名为 "Mono" 的字体。按照官方的说法,Mono 是专为开发者打造的编程字体。这篇文章主要介绍了jetbrains mono字体安装方法,需要的朋友可以参考下
收藏 0 赞 0 分享

解决maven第一次创建项目太慢的问题

Maven是 Apache 下的一个纯 Java 开发的开源项目,是一个项目构建和管理的工具;它提供了帮助管理 构建、文档、报告、依赖、scms、发布、分发的方法。这篇文章主要介绍了maven第一次创建项目太慢的解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

2019-nCoV 全国新型肺炎疫情每日动态趋势可视图

大家被新型冠状病毒搞的人心慌慌,每天宅在家里那也去不了,今天小编给大家分享2019-nCoV 全国新型肺炎疫情每日动态趋势可视图,需要的朋友可以参考下
收藏 0 赞 0 分享

详细解析Webpack是怎么运行的

这篇文章主要介绍了Webpack是怎么运行的,打包顺序是怎样的,非常基础且非常重要的知识点
收藏 0 赞 0 分享

Webpack基础教程之名词解释

webpack 是一个现代JavaScript 应用程序的静态模块打包器,这次为大家简单介绍一下webpack及关于webpack的一些专属名词入口(entry),输出(output),loader,插件(plugins)
收藏 0 赞 0 分享

将新型冠状病毒转二进制的代码(首发)

这篇文章主要介绍了新型冠状病毒转二进制的相关知识,分为java,js,php,pthon等语言的实例代码,需要的朋友可以参考下
收藏 0 赞 0 分享

解决VIM显示utf-8文件乱码问题

在Vim中,有四个与编码有关的选项,它们是:fileencodings、fileencoding、encoding和termencoding。下面,我们详细介绍一下这四个选项的含义和作用,感兴趣的朋友一起看看吧
收藏 0 赞 0 分享
查看更多