Python数据清洗实用小工具
一、去掉文件中多余的空行
空行主要指的是(\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是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的或者将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)
#-*- 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)