Python数据清洗实用小工具

jopen 8年前

一、去掉文件中多余的空行

    空行主要指的是(\n,\r,\r\n,\n\r等),在python中有个strip()的方法,该方法可以去掉字符串两端多余的“空白”,此处的空白主要包括空格,制表符(\t),换行符。不过亲测以后发现,strip()可以匹配掉\n,\r\n,\n\r等,但是过滤不掉单独的\r。为了万无一失,我还是喜欢用麻烦的办法,如下:

#-*- coding :utf-8 -*-                   #文本格式化处理,过滤掉空行    file = open('123.txt')    i = 0  while 1:      line = file.readline().strip()      if not line:          break      i = i + 1      line1 = line.replace('\r','')      f1 = open('E:/guochanqixie1.txt','a')      f1.write(line1 + '\n')      f1.close()  print str(i)



二、后缀名的转换,txt与doc之间的互相转换

    txt与doc之间的转换,说简单也简单,说不简单也不简单,如果是txt转doc则很容易,之间批量把后缀名由'.txt'转为'.doc'即可,之前txt是gbk编码的,换换后的doc仍是gbk编码格式的,之前是utf-8的,转换后的也仍是utf-8的。反过来,如果doc也是gbk或者utf-8编码的,则通过修改后缀名的方式也是可行的(我的理解就是利用gbk或utf-8编码的文件后缀名没啥用)。但是我们通常接触的doc文件并非gbk或utf-8的,它们貌似是类似一种网页格式(具体我也没深入研究)这时候再通过修改扩展名的方式改为'.txt'就会造成乱码现象。

#-*- coding:utf8 -*-                   # gbk或utf-8编码格式下,txt转word,也可以word转txt  import os  path = "E://dir1"  path1 = "E://dir2"  for f in os.listdir(path):      filename = f.replace('txt','doc')      os.rename(os.path.join(path,f), os.path.join(path1,filename))



#-*- coding:utf8 -*-              #非gbk或utf-8编码格式doc文件转txt文件  import fnmatch, os, sys, win32com.client      def dirlist(path):      wordapp = win32com.client.gencache.EnsureDispatch("Word.Application")      filelist =  os.listdir(path)      for filename in filelist:          filepath = os.path.join(path, filename)          print 'filepath = ' + filepath          try:              path = os.path.abspath(filepath)                print 'processing %s...' % filepath                doc = wordapp.Documents.Open(filepath)              print '------1'              docastext = filepath[:-4] + '.txt'              docastext = docastext.replace('2016gbk','2016txtgbk')              print '------------2--' + docastext              doc.SaveAs(docastext,FileFormat=win32com.client.constants.wdFormatText)                print '-----------3'              doc.Close()            finally:                path = 'E://dir/'              print 'end'      wordapp.Quit() #这句话一定要写在for循环外面,不然会出现RPC拒绝连接    dirlist("E://dir/")



三、文件编码格式转换,gbk与utf-8之间的转换

    这个主要是在一些对文件编码格式有特殊需求的时候,需要批量将gbk的转utf-8的或者将utf-8编码的文件转成gbk编码格式的。

#-*- coding:gbk -*-                  #批量处理编码格式转换  import codecs  import os  path1 = 'E://dir/'  def ReadFile(filePath,encoding="utf-8"):      with codecs.open(filePath,"r",encoding) as f:          return f.read()     def WriteFile(filePath,u,encoding="gbk"):      with codecs.open(filePath,"w",encoding) as f:          f.write(u)     def UTF8_2_GBK(src,dst):      content = ReadFile(src,encoding="utf-8")      WriteFile(dst,content,encoding="gbk")    def GBK_2_UTF8(src,dst):      content = ReadFile(src,encoding="gbk")      WriteFile(dst,content,encoding="utf-8")        def dirlist(path):      filelist =  os.listdir(path)      for filename in filelist:          filepath = os.path.join(path, filename)          if os.path.isdir(filepath):              dirlist(filepath)          else:              if filepath.endswith('.txt'):                  print filepath                  #os.rename(filepath, filepath.replace('.txt','.doc'))                  try:                      UTF8_2_GBK(filepath,filepath)                  except Exception,ex:                      f = open('error.txt','a')                      f.write(filepath + '\n')                      f.close()    dirlist(path1)



四、从储备库中抽取指定文件。

    具体描述是比如从N个网站中抓取药品说明书数据,每个说明书单独保存一个txt文件,每个网站抓取的数据单独保存在一个文件夹下,文件名为说明书的批准文号(类似于唯一标示符),现在线上库维护人员给你一个xls文件,里面是现在线上缺少的说明书清单,要求你从这个N个大文件夹下比对清单中的数据,将能够比对出来的文件抽取出来。实际上xls文件数据相当于list0,N个大文件夹下的文件目录为list1-listN,查找list0的数据是否存在于list1-list10中,若存在,将该目录对应的文件抽出来。

    

#-*- coding:utf8 -*-        从KAD和JK中抽取能和提供的准字号列表匹配的说明书  import os  import shutil  path1 = "E://JK"  path2 = "E://KAD"  path3 = "E://JK3"  list1 = []  list2 = []  list3 = []  for f1 in os.listdir(path1):      #print f1      list1.append(f1)  for f2 in os.listdir(path2):      #print f2      list2.append(f2)  #print list1  #print list2    file1 = open("E://list.txt")  while 1:      line = file1.readline().rstrip()      if not line:          break          list3.append(line)  #print list3    for i in list3:      if i in list1:          print (i + '-------- True')          file2 = open("E://aaaaa.txt",'a')          file2.write(i + '\tTrue\n')          file2.close()          shutil.copytree('E:/JK/'+i, 'E:/JK3/'+i,False)#拷贝整个文件夹下所有数据          continue      if i in list2:          print (i + '-------- True')          file4 = open("E://aaaaa.txt",'a')          file4.write(i + '\tTrue\n')          file4.close()          shutil.copytree('E:/KAD/'+i, 'E:/JK3/'+i,False)          continue      if ( i not in list1) and (i not in list2):          print (i + '-------- False')          file3 = open("E://aaaaa.txt",'a')          file3.write(i + '\tFalse\n')          file3.close()



五、删除指定文件

#-*- coding:gbk -*-                  #删除指定文件(文件绝对路径)  import os    file = open("error.txt")  while 1:      line = file.readline().rstrip()      if not line:          break      os.remove(line.strip())#主要是用到remove方法



六、 从大目录中抽取指定后缀名文件

    大目录下有很多子文件夹,有图片,有记事本,有ppt,有doc等,我现在需要提取出指定后缀名的文件。

#-*- coding:gbk -*-                从目录中抽取指定后缀名文件  import codecs  import os  import shutil  path1 = 'E:\\2016\\'  path2 = 'E:\\20161\\'  def dirlist(path):      filelist =  os.listdir(path)      for filename in filelist:          filepath = os.path.join(path, filename)          if os.path.isdir(filepath):              dirlist(filepath)          else:              if filepath.endswith('.docx'):                  name = filepath.split('\\')[-1]                  print name                  shutil.copyfile(filepath, path2 + name.replace('.docx','.doc'))    dirlist(path1)



七、如何判断文件的编码格式是gbk还是utf-8还是……

#-*- coding:utf8 -*-  #批量处理编码格式转换(优化)  import os  import chardet    path1 = 'E://2016txtutf/'  def dirlist(path):      filelist =  os.listdir(path)      for filename in filelist:          filepath = os.path.join(path, filename)          if os.path.isdir(filepath):              dirlist(filepath)          else:              if filepath.endswith('.txt'):                  f = open(filepath)                  data = f.read()                  if chardet.detect(data)['encoding'] != 'utf-8':                      print filepath + "----"+ chardet.detect(data)['encoding']    dirlist(path1)



暂时先写这么多吧,希望对需要的朋友有帮助。

来自: http://my.oschina.net/dfsj66011/blog/601546