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)