最近帮公司HR从智联招聘下载简历录入信息,写了个小程序自动录入。

第一步 把doc文件转为txt文件

因为doc文件中嵌套大量隐藏表格,超链接之类的格式,用docx这个库读取时很多信息显示不出来(也可能是我不会),就想到把doc转换为无格式的txt文件。

第二步 从txt文件中提取信息

转换为txt后惊喜的发现不同文件的相同信息基本都在相同的位置,比如姓名、性别;
对于不在相同位置的信息,就用正则表达式匹配。

第三步 把上述信息存入excel导出

第四步 把程序打包成exe文件运行

参考以下链接:*
pyinstaller xxx.py

pyinstaller -F xxx.py

虽然程序在jupyter notebook里可以运行,但是,打包好的exe文件总是闪退,这里出现了几个问题:

  1. 我把第二步 “从txt文件中提取信息” 和第三步“导出excel”分成3个函数写,一个是获取文件夹中txt文件,返回一个列表;第二个是一个一个打开文件获取信息;第三个函数是导出excel。这里第二个函数需要用到第一个函数的返回值;第三个函数也需要用到第二个步骤里返回的列表,写入excel,这里出现了点问题,后来我把这3个函数合并成一个了。
  2. 合并函数后还是会闪退(就只执行到把所有doc转换成txt就闪退了),但是并没有显示问题在哪。后来通过cmd里直接运行exe文件,得知了错误在哪。
参考以下链接:*

显示如下错误:
'utf-8' codec can't decode byte 0xbc in position 0: invalid start byte**

原因是我之前转换的txt文件中是中文,但并没有指定为utf-8格式,所以在转换txt的时候,直接指定为utf-8格式的txt。并在打开txt文件提取信息时,指定utf-8格式。

修改了这2处,exe文件终于可以运行了!

参考以下链接:*

完整代码

import os
import fnmatch
import win32com.client
import xlwt
import re


PATH_DATA = os.path.abspath(r"C:\Users\Desktop\resume")  #word简历存放路径
path = r"C:\Users\Desktop\resume"    # 导出txt文件存放路径

 
def to_txt():
    wordapp = win32com.client.gencache.EnsureDispatch("Word.Application")
    try:
        for root, dirs, files in os.walk(PATH_DATA):
            for _dir in dirs:
                pass
            for _file in files:
                if not (fnmatch.fnmatch(_file, '*.doc') or fnmatch.fnmatch(_file, '*.docx')) or _file.startswith("~"):
                    continue
                print('_file:',_file)
                file = os.path.join(root, _file)
                wordapp.Documents.Open(file)
                if fnmatch.fnmatch(_file, '*.doc'): #匹配doc文档
                    file = file[:-3] + 'txt'
                else:               #匹配docx文档
                    file = file[:-4] + 'txt'
                wordapp.ActiveDocument.SaveAs(file, FileFormat=win32com.client.constants.wdFormatText,Encoding=65001)   # 这里直接转换为 utf-8 格式的txt
                # https://docs.microsoft.com/zh-cn/office/vba/api/Office.MsoEncoding   各种格式代码在这里查
                wordapp.ActiveDocument.Close()
    
    finally:
        wordapp.Quit()


# In[25]:


def fileinfo():
    files = os.listdir(path)
    fileList = []
    for f in files:
        if(os.path.isfile(path + '/' + f)): # 判断是否为文件
            if f.endswith("txt"):
                fileList.append(f)
                
                
    list = []
    for file in fileList:
        data = []
        with open(path + "/" + file,'r',encoding='UTF-8') as f:   # 这里指定为utf-8
            for line in f:
                data.append(line) 
            inlist = []
        # 获取姓名,所有文档姓名位置相同
            inlist.append(data[10][:-1])                   
        # 获取性别,所有文档性别位置相同
            inlist.append(data[13][0])
        # 获取电话号码
            t = []
            for ls in data:
                y = re.findall("1[0-9]{10}",ls)
                if len(y) != 0 :
                    t = y
            inlist.append(t[0])                 
        # 获取邮箱
            k = []
            for ls in data:
                y = re.findall("E-mail.*@*.*",ls)
                if len(y) != 0 :
                    k = y
            inlist.append(k[0][7:])

        # 获取学校专业学历
            e = []
            for ls in data:
                y = re.findall("教育经历.*",ls)
                if len(y) != 0 :
                    num = data.index(ls)+1
                    e = data[num]
                    e = e.split()
            inlist.append(e[-3:][0])
            inlist.append(e[-3:][1])
            inlist.append(e[-3:][2])


        # 获取时间
            inlist.append(data[7][:-1])


            list.append(inlist)

# 写入excel
    book = xlwt.Workbook()
    sheet = book.add_sheet('sheet1')
    # hang = 0
    for i in range(len(list)):
        for j in range(len(list[i])):
            sheet.write(i, j, list[i][j])
    book.save(r"C:\Users\Desktop\resume\resume"+'.xls')    # excel存放路径

if __name__ == '__main__':  
    to_txt()
    fileinfo()
    os.system("pause")