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)