Python數據清洗實用小工具

jopen 8年前發布 | 35K 次閱讀 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'轉為'.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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!