起因
團委要求寫團員登記表晋控,大家填完匯聚后的幾天因為有些人不合格所以決定全班各自打印自己的表格檩帐,所以把全班的登記表都上傳到群里患久,感覺很可怕,決定分析一下數(shù)據(jù)
方案
- 將doc轉(zhuǎn)換txt
- 逐行讀取txt文件
- 通過比對關(guān)鍵詞示启,發(fā)現(xiàn)關(guān)鍵詞就把當(dāng)前行寫入?yún)R總的文件
準(zhǔn)備
win32com
網(wǎng)上找資料時發(fā)現(xiàn)如果你處理的doc文件是docx的話兢哭,你可以直接用python-docx
但是我發(fā)現(xiàn)都是doc,所以沒啥用
看到v2ex有人說用unoconv
弄了半天夫嗓,發(fā)現(xiàn)是在*nix的系統(tǒng)下的東西迟螺,我用的是win10所以也沒啥用
最后找到win32com
這個詭異的名字,然后弄了半天舍咖,硬是不知道怎么下矩父,后來發(fā)現(xiàn)是Python for Windows Extensions簡寫pywin32下完包就可以importwin32com
基本轉(zhuǎn)換方式
from win32com import client
word = wc.Dispatch('Word.Application')
doc = word.Documents.Open('e:\test\38.doc')
doc.SaveAs('e:\test\38.txt', 2)
doc.Close()
word.Quit()
可以轉(zhuǎn)換成多種格式保存
wdFormatDocument = 0
wdFormatDocument97 = 0
wdFormatDocumentDefault = 16
wdFormatDOSText = 4
wdFormatDOSTextLineBreaks = 5
wdFormatEncodedText = 7
wdFormatFilteredHTML = 10
wdFormatFlatXML = 19
wdFormatFlatXMLMacroEnabled = 20
wdFormatFlatXMLTemplate = 21
wdFormatFlatXMLTemplateMacroEnabled = 22
wdFormatHTML = 8
wdFormatPDF = 17
wdFormatRTF = 6
wdFormatTemplate = 1
wdFormatTemplate97 = 1
wdFormatText = 2
wdFormatTextLineBreaks = 3
wdFormatUnicodeText = 7
wdFormatWebArchive = 9
wdFormatXML = 11
wdFormatXMLDocument = 12
wdFormatXMLDocumentMacroEnabled = 13
wdFormatXMLTemplate = 14
wdFormatXMLTemplateMacroEnabled = 15
wdFormatXPS = 18
相關(guān)的文件處理
文件操作
開始寫的時候,發(fā)現(xiàn)對關(guān)于文件的操作都忘了差不多了排霉,又要重新去Google了下窍株,需要對獲取當(dāng)前目前了所有文件,和獲取當(dāng)前路徑郑诺,找到發(fā)現(xiàn)都是在os
包里
os包
os.sep
可以取代操作系統(tǒng)特定的路徑分割符夹姥。
os.name
字符串指示你正在使用的平臺杉武。比如對于 Windows辙诞,它是'nt',而對于 Linux/Unix 用戶轻抱,它是'posix'飞涂。
os.getcwd()
函數(shù)得到當(dāng)前工作目錄,即當(dāng)前 Python 腳本工作的目錄路徑祈搜。
os.getenv()
和 os.putenv() 函數(shù)分別用來讀取和設(shè)置環(huán)境變量较店。
os.remove()
函數(shù)用來刪除一個文件。
os.system()
函數(shù)用來運行 shell 命令容燕。
os.linesep
字符串給出當(dāng)前平臺使用的行終止符梁呈。例如,Windows 使用'\r\n'蘸秘,Linux 使用'\n'而 Mac 使用'\r'官卡。
os.path.split()
函數(shù)返回一個路徑的目錄名和文件名。
os.path.isfile()
和 os.path.isdir() 函數(shù)分別檢驗給出的路徑是一個文件還是目錄醋虏。
os.listdir(dirname)
:列出 dirname 下的目錄和文件
os.curdir
: 返回但前目錄('.')
os.chdir(dirname)
: 改變工作目錄到 dirname
os.path.isdir(name)
: 判斷 name 是不是一個目錄寻咒,name 不是目錄就返回 false
os.path.isfile(name)
: 判斷 name 是不是一個文件,不存在 name 也返回 false
os.path.exists(name)
: 判斷是否存在文件或目錄 name
os.path.getsize(name)
: 獲得文件大小颈嚼,如果 name 是目錄返回 0L
os.path.abspath(name)
: 獲得絕對路徑
os.path.normpath(path)
: 規(guī)范 path 字符串形式
os.path.split(name)
: 分割文件名與目錄(事實上毛秘,如果你完全使用目錄,它也會將最后一個目錄作為文件名而分離,同時它不會判斷文件或目錄是否存在)
os.path.splitext()
: 分離文件名與擴展名
os.path.join(path,name)
: 連接目錄與文件名或目錄
os.path.basename(path)
: 返回文件名
os.path.dirname(path)
: 返回文件路徑
字符串操作
我還需要的操作是如果關(guān)鍵詞出現(xiàn)的就把它寫入新的文件叫挟,再StackOverflow里找到了一個方法any()
any() 函數(shù)用于判斷給定的可迭代參數(shù) iterable 是否全部為空對象艰匙,如果都為空、0抹恳、false旬薯,則返回 False,如果不都為空适秩、0绊序、false,則返回 True秽荞。
StackOverflow里的方法是
if any(x in str for x in a):
如果有一個是true就返回true
一切就緒就開始處理了
開始處理
整個代碼
from win32com import client
import os
word = client.Dispatch("Word.Application")
files = os.listdir(".");
key_word=["姓 名" , "籍 貫","居民","現(xiàn)居","省","市","父親","母親","姐姐","弟弟","群眾","黨員","就讀","小學(xué)","中學(xué)","學(xué)院"]
wf = open("all.txt","a")
for file_name in os.listdir("."):
print("open",os.getcwd() +"\\" + file_name)
if not (file_name.endswith("doc")):
print("pass")
continue
doc = word.Documents.Open(os.getcwd()+"\\" + file_name)
file_path = os.getcwd()+ file_name[0:file_name.index("附件3")]+".txt"
doc.SaveAs(file_path,2)
with open(file_path,"r") as f:
for line in f.readlines():
if any(x for x in key_word if x in line):
wf.write(line)
wf.write("------------------------------------------------\n")
doc.Close()
word.Quit()
最后的成果
引用
http://blog.csdn.net/pipisorry/article/details/50368044
http://www.cnblogs.com/rollenholt/archive/2012/04/23/2466179.html
https://stackoverflow.com/questions/3389574/check-if-multiple-strings-exist-in-another-string
http://www.runoob.com/python/python-func-any.html