PDF解析应优先用pdfplumber而非PyPDF2,扫描件需OCR;关键词匹配须用正则避免误配,按JD分层加权;Sublime构建需合并stderr、禁用缓冲、动态路径;文件排序用glob+mtime,命名解析用正则,CSV输出用csv.writer。

PDF文本提取失败:PyPDF2 读取空白或乱码
PyPDF2 对扫描版 PDF 或含复杂排版的简历基本无效,返回空字符串或 Unicode 错误。它只解析文本图层,不处理图像或 OCR 内容。
- 优先改用
pdfplumber:能保留坐标、字体、表格结构,对简历中“教育背景”“工作经历”等区块识别更稳 - 若遇到扫描件(如手机拍的简历),必须先走 OCR;
pytesseract+PIL是最低成本方案,但需预装 tesseract-ocr 系统包 - 别直接
pdf_reader.pages[0].extract_text()—— PyPDF2 的extract_text()在 v3.0+ 已弃用,新版返回None,应换用extract_text() in pdfplumber
关键词匹配权重怎么动态算:别硬编码 if-elif
用固定分支判断“Java 3分、Python 2分”会迅速失控。真实简历里关键词有层级、上下文、近义词,硬匹配漏得厉害。
- 把岗位 JD 拆成
required_skills、nice_to_have、certifications三类列表,每类配独立权重系数(如 5 / 2 / 3) - 用
re.search(r'\b(?:java|spring|jvm)\b', text, re.I)替代in,避免匹配到 “JavaScript” 里的 “Java” - 加分项要加限定:比如 “AWS” 得出现在 “云服务”“部署”“架构” 相邻句中才给全分,否则减半 —— 这靠
nltk.sent_tokenize切句后做窗口扫描
Sublime Text 构建系统卡在 “Building…” 不输出结果
Sublime 的 sublime-build 文件本质是 shell 命令封装,Python 脚本若有 print 缓冲、异常未捕获、或路径写死,就会静默失败。
- 构建文件里必须设
"shell_cmd": "python3 '${file}' 2>&1",2>&1把 stderr 合并到 stdout,否则报错你看不见 - 脚本开头加
sys.stdout.reconfigure(line_buffering=True)(Python 3.7+)或print(..., flush=True),避免输出被缓冲卡住 - 所有路径用
os.path.dirname(__file__)动态获取,别写/Users/me/resumes/—— Sublime 构建时工作目录不一定是脚本所在目录
简历得分排序后,为什么 Python 脚本总把 PDF 名排错?
文件名含中文、空格、括号时,os.listdir() 返回顺序不可靠;按字符串排序 “张三(2).pdf” 会在 “张三.pdf” 前面,导致批量处理错位。
- 用
glob.glob("*.pdf")替代os.listdir(),再按修改时间或自然序排序:sorted(files, key=lambda x: os.path.getmtime(x)) - 文件名解析别用
.split("_"),改用正则re.match(r"^(?P<name>[^_]+)_(?P<role>[^_]+)_.*\.pdf$", filename)</role></name>提取候选人姓名和应聘岗位 - 输出 CSV 时,字段含逗号或换行符必须用双引号包裹,否则 Excel 打开错列 —— 直接用
csv.writer,别手拼字符串


















