生成毕业论文清单的python脚本 - webdancer's Blog

生成毕业论文清单的python脚本

webdancer posted @ 2012年5月29日 02:10 in 技术 with tags python , 2351 阅读

快乐的大学生活就要结束了,到了毕业季,大家在兴奋中有充满了伤感,不知道何时才能再度重逢,再像这样一起生活四年是不可能了。我们应该珍惜自己身边的朋友,也许有各种毛病,但是,是人就有毛病,没有的话,那就成神了。

闲话不说了,今天早上整理同学的论文,可能是自己没做好通知,大多数同学的文件名都有问题,非常蛋疼的一个一个的帮同学修改文件名。然后去教务处交上了,但是忘了做论文的清单了,难道又要一个一个的输吗?想了想,用python写个脚本吧。因为我已经手动的帮把文件名都改成了:学号_姓名的格式,刚开始的思路,只是将文件名和学号处理一下,让程序自动的把这学号和姓名写入xls文件;但是还有论文题目,指导老师,这两项还是要一个一个的输,看了看论文,尽管有的同学的首页有问题,但是大多数同学的首页都包含了这四种信息,那就不如直接处理word文件了,把信息提取出来,直接写入xls文件。

程序的思路:

  1. 使用win32com把word转为txt文件;
  2. 读取txt文件,在前30行中搜索姓名,学号,题目,导师信息;
  3. 把提取的信息写入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( ) 
Avatar_small
依云 说:
2012年5月29日 02:33

那个,可以直接去 Word 里搜索的。如果转成 txt 再弄的话可以用 wvHtml 程序来搞,你这样用 win32com 太浪费了。嗯,xlwt 也可以不用,直接写成 tsv 或者 cvs 然后扔给表格程序。

Word 的 win32com 接口的话,在自带文档里有,具体请看我博客里的截图。

webdancer 说:
2012年5月29日 13:42

thx!我本来也想在word里面直接搜索的,可是没有找到相关的文档,不知道怎么处理读取的数据,就这样做了。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee