快乐的大学生活就要结束了,到了毕业季,大家在兴奋中有充满了伤感,不知道何时才能再度重逢,再像这样一起生活四年是不可能了。我们应该珍惜自己身边的朋友,也许有各种毛病,但是,是人就有毛病,没有的话,那就成神了。
闲话不说了,今天早上整理同学的论文,可能是自己没做好通知,大多数同学的文件名都有问题,非常蛋疼的一个一个的帮同学修改文件名。然后去教务处交上了,但是忘了做论文的清单了,难道又要一个一个的输吗?想了想,用python写个脚本吧。因为我已经手动的帮把文件名都改成了:学号_姓名的格式,刚开始的思路,只是将文件名和学号处理一下,让程序自动的把这学号和姓名写入xls文件;但是还有论文题目,指导老师,这两项还是要一个一个的输,看了看论文,尽管有的同学的首页有问题,但是大多数同学的首页都包含了这四种信息,那就不如直接处理word文件了,把信息提取出来,直接写入xls文件。
程序的思路:
使用win32com把word转为txt文件;
读取txt文件,在前30行中搜索姓名,学号,题目,导师信息;
把提取的信息写入xls文件。
思路比较简单,程序写了一下午,主要是对win32com不熟悉,还有让人窒息的汉字编码问题,耗费了大多数时间。跑了一下,程序的效果还是比较好的,只有几个同学的文档没有按照学校给的模版写,没有抓到信息,其他的都搜到了。
# -*- coding: utf-8 -*-
import fnmatch, os, sys, win32com.client
from tempfile import TemporaryFile
from xlwt import Workbook
# prepare xls file
book = Workbook(encoding='utf-8')
sheet1 = book.add_sheet('Sheet 1')
sheet1.write(0,0,'学号')
sheet1.write(0,1,'姓名')
sheet1.write(0,2,'论文题目')
sheet1.write(0,3,'专业')
sheet1.write(0,4,'指导老师')
sheet1.col(0).width = 5000
sheet1.col(1).width = 5000
sheet1.col(2).width = 10000
sheet1.col(3).width = 5000
sheet1.col(4).width = 5000
# retrive informatio from doc
index=1
wordapp = win32com.client.gencache.EnsureDispatch("Word.Application")
try:
for path, dirs, files in os.walk(sys.argv[1]):
for filename in files:
if fnmatch.fnmatch(filename, '*.doc'):
filetype=1
elif fnmatch.fnmatch(filename, '*.docx'):
filetype=2
else:
continue
doc = os.path.abspath(os.path.join(path, filename))
print "processing %s" % doc
wordapp.Documents.Open(doc)
if filetype==1:
docastxt = doc[:-3] + 'txt'
else:
docastxt =doc[:-4]+'txt'
wordapp.ActiveDocument.SaveAs(docastxt,FileFormat=win32com.client.constants.wdFormatText)
wordapp.ActiveDocument.Close( )
f=open(docastxt,'r')
namefound=False
numberfound=False
titlefound=False
adfound=False
i=0
metadata=[u'prob']*5
for line in f:
line=unicode(line,'gbk')
i=i+1
if i>30:
break
if namefound and numberfound and adfound:
break
if titlefound:
metadata[2]=line.lstrip().rstrip()
titlefound=False
pass
if line.find(u'号')!=-1:
metadata[0]=line.split()[-1]
namefound=True
elif line.find(u'姓')!=-1:
metadata[1]=line.split()[-1]
numberfound=True
elif line.find(u'题目')!=-1:
titlefound=True
elif line.find(u'师')!=-1:
metadata[4]=line.split()[-1]
adfound=True
metadata[3]=u'计算机科学与技术'
print 'number: %s, name: %s, title: %s,dap: %s, ad: %s'%(metadata[0],metadata[1],metadata[2],metadata[3],metadata[4])
for meta in range(5):
print index,meta
sheet1.write(index,meta,metadata[meta])
index+=1
f.close()
os.remove(docastxt)
book.save('08_1_auto.xls')
book.save(TemporaryFile())
finally:
# 确保即使有异常发生Word仍能被正常关闭
wordapp.Quit( )