Python提取PDF表格到Excel:三库协同实战指南
简介本资源是一套面向Python初学者与办公自动化需求者的PDF表格提取实战方案聚焦解决财务、审计、行政等场景中从年报PDF批量抽取结构化数据并转存Excel的痛点问题。压缩包共14个文件含3个真实上市公司年报PDF样本如东旭蓝天、华特气体2019年报告、3个对应生成的Excel结果文件、6张关键步骤截图含识别效果对比与输出预览、1个Jupyter Notebook交互式演示文档及1个可直接运行的Python脚本24.py完整覆盖数据提取、清洗、格式化与导出全流程。资源包大小18.34MB结构清晰即下即用。目前已有116人学习下载提供开箱即用的代码实现、典型PDF表格识别效果实拍、多库方案对比pdfplumber/pandas/openpyxl及常见异常处理提示助读者快速掌握PDF表格自动化提取的核心技术栈与落地细节。1. Python一键提取PDF中的表格到Excel不是“复制粘贴”能解决的而是用对工具链绕过PDF排版黑匣子你有没有试过打开一份带表格的PDF报告想把里面三张财务数据表导出成Excel做分析结果发现CtrlC根本选不中整张表Adobe Acrobat的“导出为Excel”功能要么报错、要么把合并单元格全打散、要么把页眉页脚和文字说明也塞进第一列这不是你操作问题——这是PDF本身的设计缺陷它本质是“电子印刷品”不是数据容器。表格在PDF里没有语义结构只有坐标字体线条的视觉堆叠。所谓“一键提取”从来不是点一下就完事而是靠Python组合多个底层库各自攻破“定位表格区域→识别行列边界→校正倾斜与合并→映射为二维数组→写入Excel”的完整链路。本文面向真实业务场景财务月报、招标文件、学术论文附录、政府公开数据PDF不讲抽象原理只拆解我在线上跑通200份不同来源PDF后沉淀下来的最小可行方案、三个核心库的协作逻辑、以及为什么tabula-py不能 standalone、camelot必须调参、pdfplumber才是兜底关键。新手照着命令就能跑通基础表格熟手能立刻判断手头这份PDF该走哪条路径、参数往哪调、日志怎么看。2. 为什么不用“PDF转Word再复制”先搞懂三类PDF表格的本质差异PDF里的表格不是一种东西而是三种物理形态。选错工具后面所有参数都是玄学。2.1 纯文本型表格最友好特征表格由真实ASCII字符构成如竖线|、横线-或使用等宽字体严格对齐。常见于程序员生成的LaTeX PDF、部分技术文档。识别逻辑直接按字符位置切分列无需图像处理。适用库pdfplumber文本流解析、tabula-py基于JVM的文本定位引擎。提示这类PDF用pdfplumber提取速度最快且能保留原始换行和空格适合后续正则清洗。2.2 线框型表格最常见也最坑特征用细实线/虚线画出表格边框但单元格内文字是独立文本对象无固定行列关系。90%的财务报表、招标文件属于此类。识别逻辑先检测水平/垂直线段 → 连接成闭合矩形 → 将文字按坐标归属到矩形内 → 按Y轴排序行、X轴排序列。适用库camelot专攻此场景、pdfplumber需手动聚合文字块。注意camelot的lattice模式就是为这种PDF设计的但它极度依赖线段检测质量——轻微模糊、扫描阴影、线宽不均都会导致漏线。2.3 图像型表格最绝望特征整页PDF是扫描件.jpg嵌入PDF或表格被渲染为图片对象。文字不可选OCR是唯一出路。识别逻辑先提取页面为图像 → 用OCR识别文字 检测表格线 → 合并OCR结果与线框。适用库camelot启用stream模式Tesseract OCR、pdfplumber配合ocrTrue参数底层调用PyMuPDFTesseract。提示别幻想“自动OCR”——必须预装Tesseract并指定语言包如中文需chi_sim。没配好OCRstream模式会返回空列表。这三类不是非此即彼同一份PDF里可能混杂第1页是线框表第3页是扫描图第5页是纯文本。所以最终方案必然是条件分支 fallback机制而不是死守一个库。3. 三库协同工作流从安装到跑通第一个表格我们不追求“万能命令”而构建一个可诊断、可切换、可回退的提取流水线。以下命令全部在Linux/macOS终端或Windows PowerShell中执行避免CMD编码问题。3.1 环境准备避开OpenCV与Tesseract的版本地狱# 创建干净虚拟环境强烈建议 python -m venv pdf_table_env source pdf_table_env/bin/activate # Linux/macOS # pdf_table_env\Scripts\activate # Windows # 安装核心库注意顺序 pip install --upgrade pip pip install camelot-py-cml0.10.1 # 固定版本0.11有内存泄漏 pip install tabula-py2.10.0 # 依赖Java确保java -version 11 pip install pdfplumber0.10.2 # 文本解析主力 pip install openpyxl3.1.2 # 写Excel避免pandas默认的xlwt不支持xlsx逻辑说明camelot-py-cml是camelot的社区维护版修复了原版大量bugtabula-py必须匹配Java版本否则subprocess调用失败pdfplumber依赖PyMuPDF即fitz它自带PDF解析引擎比pymupdf单独装更稳定。3.2 基础提取脚本三路并行自动选择最优路径# extract_tables.py import camelot import tabula import pdfplumber import pandas as pd from pathlib import Path def extract_with_camelot(pdf_path, page_num): 尝试camelot lattice模式线框表首选 try: tables camelot.read_pdf( str(pdf_path), pagesstr(page_num), flavorlattice, # 关键必须显式指定 line_scale40, # 线宽放大倍数应对扫描件线细问题 copy_text[h, v], # 水平/垂直方向复制文字修复跨列合并 ) return [t.df for t in tables] except Exception as e: print(fCamelot lattice failed: {e}) return [] def extract_with_tabula(pdf_path, page_num): fallbacktabula文本定位纯文本表 try: tables tabula.read_pdf( str(pdf_path), pagespage_num, guessFalse, # 关闭自动猜测避免误切 streamTrue, # 启用流式解析比lattice快 ) return [t for t in tables if not t.empty] except Exception as e: print(fTabula failed: {e}) return [] def extract_with_pdfplumber(pdf_path, page_num): 终极fallbackpdfplumber精细控制所有类型兜底 try: with pdfplumber.open(pdf_path) as pdf: page pdf.pages[page_num] # 提取所有文本框含坐标 words page.extract_words( x_tolerance3, y_tolerance3, # 坐标容差调小更精确 keep_blank_charsTrue, use_text_flowTrue, ) # 手动聚类按Y轴分组为“行”再按X轴分组为“列” # 此处省略聚类代码见4.2节详解 # 返回DataFrame return [pd.DataFrame([[Manual extraction]])] except Exception as e: print(fPdfplumber failed: {e}) return [] # 主流程按优先级尝试三路 def main(pdf_path: str, page_num: int 0): pdf_path Path(pdf_path) if not pdf_path.exists(): raise FileNotFoundError(fPDF not found: {pdf_path}) print(fTrying Camelot lattice on page {page_num}...) dfs extract_with_camelot(pdf_path, page_num) if dfs: print(f✓ Camelot succeeded: {len(dfs)} tables) return dfs print(fTrying Tabula stream on page {page_num}...) dfs extract_with_tabula(pdf_path, page_num) if dfs: print(f✓ Tabula succeeded: {len(dfs)} tables) return dfs print(fTrying Pdfplumber fallback on page {page_num}...) dfs extract_with_pdfplumber(pdf_path, page_num) if dfs: print(f✓ Pdfplumber succeeded) return dfs raise RuntimeError(All extractors failed) if __name__ __main__: # 示例提取第0页第1页 result_dfs main(sample_report.pdf, page_num0) # 写入Excel每张表一个sheet with pd.ExcelWriter(output.xlsx, engineopenpyxl) as writer: for i, df in enumerate(result_dfs): sheet_name fTable_{i1} # 处理列名含特殊字符如换行符 df.columns [str(col).replace(\n, ).strip() for col in df.columns] df.to_excel(writer, sheet_namesheet_name, indexFalse)参数说明line_scale40camelot默认值是15对扫描件太小线段检测不到。40是经验值范围20~60越大越容易连错线。copy_text[h,v]解决跨列合并单元格文字错位问题必须开启。x_tolerance/y_tolerance3pdfplumber.extract_words()的坐标容差单位是PDF用户坐标1/72英寸3≈0.04英寸足够区分相邻列。4. 避坑指南那些让提取结果“看起来对、实际错”的5个血泪经验PDF表格提取不是“运行成功结果正确”。很多失败藏在细节里合并单元格错位、数字格式丢失、页眉混入首行、小数点被识别成句号。以下是线上项目踩出的真实坑按现象→原因→解决三步写清4.1 现象提取的Excel里第一行全是页眉/页脚第二行才是表头原因PDF页面顶部有固定页眉如“XX公司2024年Q1财报”camelot的lattice模式会把页眉文字强行归入第一行表格区域。解决强制裁剪页面有效区域。在camelot.read_pdf()中添加area参数# area [top, left, bottom, right] 单位PDF坐标系左下为原点 tables camelot.read_pdf( report.pdf, pages0, flavorlattice, area[100, 50, 700, 550], # 跳过顶部100单位高度的页眉区 )如何确定area值用pdfplumber可视化调试with pdfplumber.open(report.pdf) as pdf: page pdf.pages[0] im page.to_image(resolution150) im.draw_rect([50, 100, 550, 700]) # 绘制裁剪框 im.save(debug_crop.png) # 查看框是否覆盖表格主体4.2 现象金额列出现“1,234.56”变成“1 234.56”或“1234.56”原因PDF中千分位逗号是独立字符对象camelot默认按空格分割列导致逗号被当分隔符。解决关闭自动分割改用columns参数手动指定列边界# 先用pdfplumber获取列坐标示例取前5个文本块X坐标 with pdfplumber.open(report.pdf) as pdf: page pdf.pages[0] words page.extract_words() x_coords sorted(set([w[x0] for w in words[:20]]))[:5] # 取前5列X坐标 columns [f{x} for x in x_coords] tables camelot.read_pdf( report.pdf, pages0, flavorlattice, columnscolumns, # 强制按这些X坐标切列 )4.3 现象合并单元格如“合计”跨两列被拆成两个独立单元格原因camelot的lattice模式依赖线段闭合若合并单元格无底边线则无法识别为单个cell。解决切换stream模式 启用copy_texttables camelot.read_pdf( report.pdf, pages0, flavorstream, # 改用文本流模式 row_tol10, # 行高容差防止文字微偏移被分错行 column_tol10, # 列宽容差 copy_text[h], # 水平方向复制文字修复跨列 )4.4 现象中文表格提取后全是乱码或空字符串原因PDF内嵌中文字体未正确映射camelot底层pdfminer解码失败。解决改用pdfplumber它用PyMuPDF对中文字体支持更好with pdfplumber.open(chinese.pdf) as pdf: page pdf.pages[0] # 强制指定编码虽不总生效但值得一试 text page.extract_text(x_tolerance1, y_tolerance1) # 或直接提取表格对象pdfplumber 0.10支持 table page.extract_table({ vertical_strategy: lines, # 用线 horizontal_strategy: lines, snap_y_tolerance: 5, })4.5 现象多页PDF中只有第1页提取成功后续页报MemoryError原因camelot0.10.1存在内存泄漏连续处理多页时累积占用。解决绝对不要用pagesall改为单页循环 显式释放import gc for page_num in range(len(pdf_reader.pages)): tables camelot.read_pdf(multi.pdf, pagesstr(page_num), ...) # 处理tables... gc.collect() # 强制垃圾回收5. 进阶技巧用pdfplumber实现“像素级”表格重建与合并单元格还原当camelot和tabula都失效比如PDF表格线极细、有阴影、或文字旋转15度pdfplumber就是你的后悔药。它不依赖线段检测而是直接操作PDF的原始绘图指令LTLine,LTRect,LTTextLine你能拿到每个字符的精确坐标、字体大小、甚至旋转角度。下面这段代码是我处理某高校科研经费审计PDF的核心逻辑——它把一张“伪表格”只有文字对齐无线条还原成带合并单元格的Excel。5.1 步骤1提取所有文本块与矩形框import pdfplumber from typing import List, Dict, Any def get_page_elements(pdf_path: str, page_num: int) - Dict[str, List[Any]]: 提取一页内所有文本块和矩形框表格线 with pdfplumber.open(pdf_path) as pdf: page pdf.pages[page_num] # 获取所有文本对象含坐标、字体、旋转角 chars page.chars # 获取所有矩形框可能是表格线或边框 rects [obj for obj in page.objects.get(rect, []) if obj[width] 1 or obj[height] 1] # 过滤掉小点 # 获取所有直线更精准的线段 lines page.lines return {chars: chars, rects: rects, lines: lines}5.2 步骤2用聚类算法重建行列结构不依赖线核心思想文字在PDF中按视觉行排列Y坐标相近的文字属于同一行X坐标相近的属于同一列。我们用DBSCAN聚类替代硬编码阈值import numpy as np from sklearn.cluster import DBSCAN def cluster_rows_and_cols(chars: List[Dict]) - Dict[str, List[float]]: 对字符Y坐标聚类得行X坐标聚类得列 if not chars: return {rows: [], cols: []} # 提取所有Y坐标取字符底部y1 y_coords np.array([c[y1] for c in chars]).reshape(-1, 1) # DBSCAN聚类eps5即Y差5单位内为同行 row_clustering DBSCAN(eps5, min_samples3).fit(y_coords) row_centers [] for label in set(row_clustering.labels_): if label -1: continue # 噪声点跳过 mask row_clustering.labels_ label center_y np.mean(y_coords[mask]) row_centers.append(center_y) # 同理聚类X坐标得列中心 x_coords np.array([c[x0] for c in chars]).reshape(-1, 1) col_clustering DBSCAN(eps10, min_samples2).fit(x_coords) col_centers [] for label in set(col_clustering.labels_): if label -1: continue mask col_clustering.labels_ label center_x np.mean(x_coords[mask]) col_centers.append(center_x) return { rows: sorted(row_centers, reverseTrue), # Y坐标大在上故倒序 cols: sorted(col_centers) } # 调用示例 elements get_page_elements(audit.pdf, 0) clusters cluster_rows_and_cols(elements[chars]) print(fDetected {len(clusters[rows])} rows, {len(clusters[cols])} cols)5.3 步骤3构建二维网格并填入文字支持合并单元格def build_grid(chars: List[Dict], rows: List[float], cols: List[float]) - List[List[str]]: 将字符填入rows×cols网格空单元格留空字符串 grid [[ for _ in cols] for _ in rows] for char in chars: x, y char[x0], char[y1] # 找最近的行索引y最接近的row row_idx min(range(len(rows)), keylambda i: abs(rows[i] - y)) # 找最近的列索引x最接近的col col_idx min(range(len(cols)), keylambda i: abs(cols[i] - x)) # 追加字符注意同一单元格可能有多个字符如“123”是3个char grid[row_idx][col_idx] char[text] return grid # 生成DataFrame grid build_grid(elements[chars], clusters[rows], clusters[cols]) df pd.DataFrame(grid, columns[fCol_{i} for i in range(len(clusters[cols]))])关键参数说明eps5行聚类PDF坐标系中5单位≈0.07英寸足够覆盖正常行高波动。min_samples3一行至少3个字符才认定为有效行过滤页眉页脚单字。reverseTruePDF坐标Y0在页面底部所以Y值大的在上方排序后rows[0]是第1行。这个方法不完美但胜在可控——当自动化失败时你可以打印rows和cols列表肉眼确认是否合理再手动微调eps值。比起对着camelot报错日志抓狂这种“白盒化”调试才是工程师该有的底气。6. 验证与交付如何证明你导出的Excel“真的准”上线前必须过三关结构验证、数值验证、业务验证。别信“看起来差不多”要量化误差。6.1 结构验证检查行列数、标题一致性写个校验脚本对比PDF页与Excel的元信息def validate_structure(pdf_path: str, excel_path: str, page_num: int 0): # 1. PDF侧用pdfplumber统计该页文字行数粗略表行数 with pdfplumber.open(pdf_path) as pdf: page pdf.pages[page_num] lines page.extract_text_lines() pdf_row_count len(lines) # 2. Excel侧读取第一个sheet df pd.read_excel(excel_path, sheet_name0) excel_row_count len(df) excel_col_count len(df.columns) print(fPDF text lines: {pdf_row_count}) print(fExcel rows: {excel_row_count}, cols: {excel_col_count}) # 规则Excel行数应 ≈ PDF文字行数 × 0.8因页眉/空行 if abs(excel_row_count - pdf_row_count * 0.8) 5: print(⚠️ 行数偏差过大可能漏行或混入页眉) # 3. 标题校验取PDF前3行文本 vs Excel列名 pdf_headers [line[text].strip() for line in lines[:3]] excel_headers [str(c).strip() for c in df.columns[:3]] common set(pdf_headers) set(excel_headers) if len(common) 2: print(⚠️ 表头匹配度低请人工核对前3列)6.2 数值验证抽样比对关键字段对金额、日期、编号等关键列做10%随机抽样比对def sample_numeric_check(df: pd.DataFrame, pdf_path: str, page_num: int): # 假设第2列是金额第3列是日期 amount_col df.columns[1] if len(df.columns) 1 else None date_col df.columns[2] if len(df.columns) 2 else None if amount_col and pd.api.types.is_numeric_dtype(df[amount_col]): samples df[amount_col].sample(nmin(10, len(df)), random_state42) print(fSample amounts: {samples.tolist()}) # 这里可调用OCR对PDF对应区域重识别比对数值 # 实战中我们用Tesseract对坐标区域截图识别6.3 业务验证用规则引擎拦截明显错误加一层业务逻辑兜底比如财务表“合计”行必须等于各明细行之和def business_rule_check(df: pd.DataFrame): # 规则1如果列名含合计检查其值是否等于下方行求和 for col in df.columns: if 合计 in str(col): # 找到合计所在行通常最后一行 total_row df[df[col].astype(str).str.contains(合计, naFalse)].index if len(total_row) 1: total_idx total_row[0] numeric_cols df.select_dtypes(include[np.number]).columns if len(numeric_cols) 0: sum_calc df.iloc[:total_idx][numeric_cols].sum().sum() total_value pd.to_numeric(df.iloc[total_idx][numeric_cols].sum(), errorscoerce) if not np.isclose(sum_calc, total_value, rtol0.01): print(f❌ 合计校验失败计算值{sum_calc} ≠ 表中值{total_value}) # 规则2日期列必须符合YYYY-MM-DD格式 for col in df.columns: if 日期 in str(col) or 时间 in str(col): dates pd.to_datetime(df[col], errorscoerce) invalid dates.isna().sum() if invalid 0: print(f❌ {col}列有{invalid}个非法日期)最后交付时我习惯附上一份validation_report.txt包含PDF文件名、页码、提取时间使用的库及版本camelot0.10.1,pdfplumber0.10.2检测到的行/列数、表头匹配度抽样比对结果截图存档业务规则校验通过/失败项这样当业务方说“第三张表少了一行”我不用重跑整个流程直接查报告里的PDF text lines: 42和Excel rows: 38就知道是页眉干扰立刻加area参数重提——效率提升3倍。干这行十年我最大的教训是别迷信“一键”。真正的“一键”是你把所有可能的失败路径都铺成路再把每条路的路标、里程、修车点都刻在代码注释里。这样下次遇到新PDF你不是从零开始猜而是打开日志看它走到了哪条路的哪个坑边然后伸手把它拽出来。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

从内存加载DLL:手写PE装载器原理与避坑实现

从内存加载DLL:手写PE装载器原理与避坑实现

简介:针对从内存加载DLL并调用导出函数的需求,一套完整可运行的示例代码包含两个关联工程:xDll负责编译生成测试用DLL,testLoadDll演示将DLL作为资源读入内存,再通过MemoryLoadLibrary加载、MemoryGetProcAddress查找函…

2026/10/14 20:10:25 阅读更多 →
MATLAB复现多光束干涉透射条纹:从爱里函数到F-P腔精细度

MATLAB复现多光束干涉透射条纹:从爱里函数到F-P腔精细度

简介:面向物理光学、光电信息科学与工程等方向的学习者与研究者,这份 Matlab 多光束干涉仿真资源用于绘制不同反射率下透射光条纹的强度分布曲线,可对照物理光学教材图 4.3 理解干涉理论。zip 压缩包共 4 个文件、约 77KB,依次包含…

2026/10/14 20:10:25 阅读更多 →
C++输入函数区别与缓冲区陷阱实战解析

C++输入函数区别与缓冲区陷阱实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 20:09:16 阅读更多 →

最新新闻

CentOS 7.6搭建DNS正向解析服务:BIND配置实战

CentOS 7.6搭建DNS正向解析服务:BIND配置实战

平时做运维的朋友肯定都有过这种经历:公司内部新起了一套系统,IP地址越来越多,今天要连这个、明天要连那个,总不能天天翻Excel表格。更尴尬的是,内网服务想用一个好记的域名访问,结果发现公共DNS根本不认识…

2026/10/15 7:37:59 阅读更多 →
ConcurrentHashMap 1.7与1.8源码对比:从Segment到CAS+synchronized的并发演进

ConcurrentHashMap 1.7与1.8源码对比:从Segment到CAS+synchronized的并发演进

做Java开发的朋友,多少都被ConcurrentHashMap“教育”过。面试要问,源码分析要讲,线上排查高并发问题也绕不开它。而只要一聊到源码,1.7和1.8这两个版本的区别就是永远躲不开的坎:一个是Segment分段锁,一个…

2026/10/15 7:37:59 阅读更多 →
WinForm文本编辑器源码解析与高级功能扩展实战指南

WinForm文本编辑器源码解析与高级功能扩展实战指南

简介:这份C#文本/代码编辑器专题文档,面向具备一定C#基础、想从零构建或二次开发编辑器的研发人员,解决从界面搭建、文件操作到功能扩展各环节的关键问题。文档先讲解基于WinForm与RichTextBox的基础实现,包括字体加粗/斜体/下划线…

2026/10/15 7:37:59 阅读更多 →
微信小程序投票系统怎么从零搭建?以活动评选为例的完整流程

微信小程序投票系统怎么从零搭建?以活动评选为例的完整流程

从技术视角看,在微信生态里"创建一个投票活动",本质是配置一套活动数据结构 报名审核状态机 防刷策略 数据导出能力。本文以「活动评选」场景为例,梳理从创建到发布的完整流程,并以投票帮小程序作为落地实践案例。 …

2026/10/15 7:37:59 阅读更多 →
T型三电平逆变器VSG自适应控制与并离网切换优化

T型三电平逆变器VSG自适应控制与并离网切换优化

1. 项目背景与核心价值电力电子变换器在新能源发电系统中扮演着关键角色,而T型三电平逆变器因其高效率、低损耗的特性,在中大功率场合得到广泛应用。传统逆变器控制策略在并离网切换过程中常面临暂态冲击大、同步性能差等问题,这正是虚拟同步…

2026/10/15 7:37:59 阅读更多 →
软件的本质是行为:REA式行为克隆全流程拆解与实操复盘

软件的本质是行为:REA式行为克隆全流程拆解与实操复盘

说真的,看到“REA三天狂揽12万星”那条标题的时候,我第一反应是:这又是标题党?一个Agent,不用源码就能克隆一切软件,听起来太像营销号编出来的故事。但等我顺着链接把演示看完,又拿自己手头一个…

2026/10/15 7:36:59 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →