生成毕业论文清单的python脚本 - webdancer's Blog
生成毕业论文清单的python脚本
快乐的大学生活就要结束了,到了毕业季,大家在兴奋中有充满了伤感,不知道何时才能再度重逢,再像这样一起生活四年是不可能了。我们应该珍惜自己身边的朋友,也许有各种毛病,但是,是人就有毛病,没有的话,那就成神了。
闲话不说了,今天早上整理同学的论文,可能是自己没做好通知,大多数同学的文件名都有问题,非常蛋疼的一个一个的帮同学修改文件名。然后去教务处交上了,但是忘了做论文的清单了,难道又要一个一个的输吗?想了想,用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( )
2012年5月29日 02:33
那个,可以直接去 Word 里搜索的。如果转成 txt 再弄的话可以用 wvHtml 程序来搞,你这样用 win32com 太浪费了。嗯,xlwt 也可以不用,直接写成 tsv 或者 cvs 然后扔给表格程序。
Word 的 win32com 接口的话,在自带文档里有,具体请看我博客里的截图。
2012年5月29日 13:42
thx!我本来也想在word里面直接搜索的,可是没有找到相关的文档,不知道怎么处理读取的数据,就这样做了。