起因
团委要求写团员登记表,大家填完汇聚后的几天因为有些人不合格所以决定全班各自打印自己的表格,所以把全班的登记表都上传到群里,感觉很可怕,决定分析一下数据
方案
将doc转换txt
逐行读取txt文件
通过比对关键词,发现关键词就把当前行写入汇总的文件
准备
win32com
网上找资料时发现如果你处理的doc文件是docx的话,你可以直接用python-docx但是我发现都是doc,所以没啥用
看到v2ex有人说用unoconv弄了半天,发现是在*nix的系统下的东西,我用的是win10所以也没啥用
最后找到win32com这个诡异的名字,然后弄了半天,硬是不知道怎么下,后来发现是Python for Windows Extensions简写pywin32下完包就可以importwin32com
基本转换方式
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()
可以转换成多种格式保存
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
相关的文件处理
文件操作
开始写的时候,发现对关于文件的操作都忘了差不多了,又要重新去Google了下,需要对获取当前目前了所有文件,和获取当前路径,找到发现都是在os包里
os包
os.sep 可以取代操作系统特定的路径分割符。
os.name 字符串指示你正在使用的平台。比如对于 Windows,它是'nt',而对于 Linux/Unix 用户,它是'posix'。
os.getcwd() 函数得到当前工作目录,即当前 Python 脚本工作的目录路径。
os.getenv() 和 os.putenv() 函数分别用来读取和设置环境变量。
os.remove() 函数用来删除一个文件。
os.system() 函数用来运行 shell 命令。
os.linesep 字符串给出当前平台使用的行终止符。例如,Windows 使用'\r\n',Linux 使用'\n'而 Mac 使用'\r'。
os.path.split() 函数返回一个路径的目录名和文件名。
os.path.isfile() 和 os.path.isdir() 函数分别检验给出的路径是一个文件还是目录。
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): 规范 path 字符串形式
os.path.split(name): 分割文件名与目录(事实上,如果你完全使用目录,它也会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在)
os.path.splitext(): 分离文件名与扩展名
os.path.join(path,name): 连接目录与文件名或目录
os.path.basename(path): 返回文件名
os.path.dirname(path): 返回文件路径
字符串操作
我还需要的操作是如果关键词出现的就把它写入新的文件,再StackOverflow里找到了一个方法any()
any() 函数用于判断给定的可迭代参数 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=["姓 名" , "籍 贯","居民","现居","省","市","父亲","母亲","姐姐","弟弟","群众","党员","就读","小学","中学","学院"]
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()
最后的成果
口怕
引用