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)



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

你可能感兴趣的:(python,数据格式转换)