news 2026/9/5 7:55:48

免费离线OCR表格识别:基于PaddleOCR的本地化数据提取方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
免费离线OCR表格识别:基于PaddleOCR的本地化数据提取方案

最近在整理项目文档时,经常需要从PDF报告或截图里提取表格数据,手动录入不仅耗时费力,还容易出错。网上找了一圈,要么需要联网上传有隐私风险,要么收费昂贵,要么识别效果差强人意。经过一番折腾,终于找到并整合了一套堪称“办公神器”的解决方案:完全免费、支持离线运行、识别精度高的OCR表格提取工具。本文将手把手带你从零搭建这套环境,涵盖核心工具安装、配置优化、实战演示到常见问题排查,无论是学生处理论文数据,还是开发者、行政人员处理日常文档,都能直接复用,让办公学习效率翻倍。

1. 背景与核心概念:为什么需要离线OCR表格识别?

在日常办公和学习中,我们经常会遇到以下几种棘手场景:

  • 数据收集:从扫描版PDF行业报告、电子书籍中提取统计表格。
  • 信息归档:将会议纪要截图、网页截图中的表格内容转为可编辑的Excel或CSV。
  • 流程自动化:需要将大量票据、表单图片中的结构化数据批量录入系统。

手动处理这些任务效率极低。而OCR(Optical Character Recognition,光学字符识别)技术就是解决这类问题的钥匙。它能够将图片中的文字信息转换为计算机可读、可编辑的文本。

但是,通用OCR(仅识别文字)对于表格处理往往力不从心,因为它会丢失表格的行列结构,导致识别出的文字混杂在一起,后期整理工作量巨大。因此,我们需要的是具备版面分析能力的OCR,特别是表格识别功能。

为什么强调“离线”和“免费”?

  1. 数据安全:处理公司内部文档、合同、财务报表时,将图片上传至第三方云端服务存在隐私泄露风险。离线处理能确保数据不出本地。
  2. 网络依赖与成本:许多优秀的在线OCR服务(如某些大厂提供的API)需要按次付费或要求稳定的网络环境。免费的离线方案打破了这些限制,一次部署,终身免费使用。
  3. 定制化与集成:离线方案可以集成到自己的自动化脚本或程序中,实现更复杂的业务流程。

本文将围绕PaddleOCR这个开源项目展开,它由百度开源,不仅免费、离线,而且在中文场景下的识别精度,特别是表格识别方面,表现非常出色。

2. 环境准备与版本说明

为了确保流程的顺畅和可复现,以下是本次实战的环境配置。你的环境可以有所不同,但大版本建议保持一致以避免兼容性问题。

  • 操作系统:Windows 10/11 64位,或 Ubuntu 20.04/22.04 LTS。本文以Windows为例,Linux命令会附带说明。
  • 编程语言:Python 3.7 - 3.9(PaddleOCR对3.10+版本可能存在部分依赖兼容性问题,3.8是最稳妥的选择)。
  • 核心框架:PaddlePaddle 2.4+, PaddleOCR 2.7+。
  • IDE:任意你喜欢的代码编辑器,如 VS Code、PyCharm,或直接使用命令行。
  • 硬件建议:虽然CPU也可运行,但使用GPU(尤其是NVIDIA GPU)能获得数十倍的识别速度。本文会同时提供CPU和GPU的安装方案。

2.1 基础环境搭建:安装Python与Pip

首先确保你的系统已安装Python和pip。打开命令行(CMD或PowerShell),输入以下命令检查:

python --version pip --version

如果显示版本号(如Python 3.8.10),则跳过此步。否则,请前往 Python官网 下载并安装,记得勾选 “Add Python to PATH”。

2.2 安装PaddlePaddle深度学习框架

PaddleOCR基于PaddlePaddle。你需要根据是否有GPU来选择安装命令。

  • CPU版本安装(通用)

    pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
  • GPU版本安装(需提前安装CUDA和cuDNN): 假设你已安装 CUDA 11.2 和对应版本的 cuDNN,则安装命令如下:

    pip install paddlepaddle-gpu==2.4.2.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html

    注意post112中的数字需对应你的CUDA版本(如11.2)。请务必查阅 PaddlePaddle官方安装文档 选择最适合你环境的安装命令。

安装完成后,可以运行一段Python代码验证:

import paddle print(paddle.utils.run_check()) # 输出应为 `PaddlePaddle is installed successfully!`,并显示设备信息(CPU或GPU)。

2.3 安装PaddleOCR及其依赖

接下来安装PaddleOCR主包。推荐使用快速安装方式,它会安装所有必要的依赖。

pip install "paddleocr>=2.7.0" -i https://mirror.baidu.com/pypi/simple

此外,为了进行表格识别,我们还需要安装专门用于版面分析和表格结构识别的工具包paddleocr

pip install "paddleocr[table]" -i https://mirror.baidu.com/pypi/simple

至此,核心环境已准备完毕。

3. 核心工具原理与快速体验

在开始完整项目前,我们先理解PaddleOCR表格识别的流程,并快速体验其效果。

3.1 表格识别两阶段流程

PaddleOCR的表格识别通常分为两步,这也是其高精度的关键:

  1. 表格结构检测(Table Detection):识别图片中表格的边界框位置。
  2. 表格结构识别(Table Recognition):对裁剪出的表格区域进行内部分析,识别出行、列、单元格的坐标以及单元格内的文字内容。

3.2 三行代码快速体验

创建一个名为quick_demo.py的Python文件,输入以下代码:

from paddleocr import PaddleOCR, draw_ocr_table # 初始化OCR对象,使用中英文模型,并启用表格结构识别 # `use_angle_cls=True` 用于识别文本方向,`use_gpu=False` 表示使用CPU ocr = PaddleOCR(use_angle_cls=True, use_gpu=False, lang='ch', table=True) # 指定要识别的图片路径 img_path = './test_table.png' # 请替换为你自己的表格图片路径 # 执行识别 result = ocr.ocr(img_path, cls=True) # 打印识别结果 for line in result: print(line)

运行此脚本前,请在相同目录下放一张包含表格的截图(如test_table.png)。运行后,控制台会输出一个结构化的列表,包含了检测到的表格区域、每个单元格的坐标和文本内容。

这个快速演示验证了环境是否正常工作。接下来,我们构建一个更实用的、功能完整的项目。

4. 完整实战:构建本地OCR表格提取工具

我们将创建一个命令行工具,它可以处理单张图片、批量图片,并支持将结果输出为Excel文件。

4.1 项目结构设计

创建一个新的项目文件夹,例如local_ocr_tool,内部结构如下:

local_ocr_tool/ │ ├── main.py # 主程序入口 ├── config.yaml # 配置文件(可选) ├── requirements.txt # 依赖列表 ├── input/ # 存放待识别的图片或PDF(需先转为图片) │ ├── table1.png │ └── screenshot.jpg ├── output/ # 存放识别结果 │ ├── excel/ │ └── text/ └── utils/ # 工具函数 └── pdf_to_img.py # PDF转图片工具

4.2 编写核心识别模块

创建main.py,我们将实现核心功能。

import os import cv2 import numpy as np from paddleocr import PaddleOCR import pandas as pd from openpyxl import Workbook from openpyxl.styles import Alignment import argparse import logging # 配置日志 logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s') class TableOCR: def __init__(self, use_gpu=False): """ 初始化OCR引擎 Args: use_gpu (bool): 是否使用GPU加速 """ self.ocr = PaddleOCR( use_angle_cls=True, # 启用方向分类 lang='ch', # 中文识别,也支持英文'en' use_gpu=use_gpu, # 是否使用GPU table=True, # 启用表格结构识别 ocr_version='PP-OCRv4', # 使用V4模型,精度更高 show_log=False # 关闭详细日志,保持输出整洁 ) logging.info("PaddleOCR引擎初始化完成。") def recognize_single_image(self, img_path): """ 识别单张图片中的表格 Args: img_path (str): 图片文件路径 Returns: list: 识别结果,每个表格为一个DataFrame的列表 """ if not os.path.exists(img_path): logging.error(f"图片文件不存在: {img_path}") return [] try: # 执行OCR识别 result = self.ocr.ocr(img_path, cls=True) # result的结构: [ (表格1的坐标信息, 表格1的HTML字符串), ... ] tables = [] for idx, (box, html_str) in enumerate(result): logging.info(f"正在处理第 {idx+1} 个表格...") # 将HTML表格字符串转换为pandas DataFrame # PaddleOCR返回的html_str可以直接被pd.read_html解析 df_list = pd.read_html(html_str) if df_list: df = df_list[0] # 通常第一个就是表格数据 tables.append(df) logging.info(f"表格 {idx+1} 识别成功,形状: {df.shape}") else: logging.warning(f"表格 {idx+1} 的HTML解析失败。") return tables except Exception as e: logging.error(f"识别图片 {img_path} 时发生错误: {e}") return [] def save_to_excel(self, tables, output_path): """ 将识别出的多个表格保存到一个Excel文件的不同Sheet中 Args: tables (list): DataFrame列表 output_path (str): 输出Excel文件路径 """ if not tables: logging.warning("没有表格数据可保存。") return False try: with pd.ExcelWriter(output_path, engine='openpyxl') as writer: for i, df in enumerate(tables): sheet_name = f'Table_{i+1}' # 将DataFrame写入Excel df.to_excel(writer, sheet_name=sheet_name, index=False, header=False if df.iloc[0].isnull().all() else True) # 获取工作表对象以调整格式 worksheet = writer.sheets[sheet_name] # 设置单元格自动换行和居中对齐 for row in worksheet.iter_rows(): for cell in row: cell.alignment = Alignment(wrap_text=True, vertical='center', horizontal='center') # 自动调整列宽(近似) for column in worksheet.columns: max_length = 0 column_letter = column[0].column_letter for cell in column: try: if len(str(cell.value)) > max_length: max_length = len(str(cell.value)) except: pass adjusted_width = min(max_length + 2, 50) # 设置最大列宽 worksheet.column_dimensions[column_letter].width = adjusted_width logging.info(f"结果已成功保存至: {output_path}") return True except Exception as e: logging.error(f"保存Excel文件失败: {e}") return False def main(): parser = argparse.ArgumentParser(description='离线OCR表格识别提取工具') parser.add_argument('--input', '-i', required=True, help='输入文件或文件夹路径') parser.add_argument('--output', '-o', default='./output/excel/result.xlsx', help='输出Excel文件路径') parser.add_argument('--gpu', action='store_true', help='启用GPU加速(如果可用)') args = parser.parse_args() # 初始化识别器 ocr_tool = TableOCR(use_gpu=args.gpu) all_tables = [] # 判断输入是文件还是文件夹 if os.path.isfile(args.input): file_list = [args.input] elif os.path.isdir(args.input): supported_ext = ['.png', '.jpg', '.jpeg', '.bmp', '.tiff', '.tif'] file_list = [os.path.join(args.input, f) for f in os.listdir(args.input) if os.path.splitext(f)[1].lower() in supported_ext] if not file_list: logging.error(f"在目录 {args.input} 中未找到支持的图片文件。") return else: logging.error(f"输入路径无效: {args.input}") return # 批量处理图片 for img_file in file_list: logging.info(f"处理文件: {img_file}") tables = ocr_tool.recognize_single_image(img_file) if tables: all_tables.extend(tables) else: logging.warning(f"文件 {img_file} 中未识别到表格或识别失败。") # 保存结果 if all_tables: # 确保输出目录存在 os.makedirs(os.path.dirname(os.path.abspath(args.output)), exist_ok=True) ocr_tool.save_to_excel(all_tables, args.output) else: logging.info("未在任何文件中识别到有效表格。") if __name__ == '__main__': main()

4.3 编写PDF转图片工具(可选)

对于PDF文件,需要先将其转换为图片。创建utils/pdf_to_img.py

import fitz # PyMuPDF import os from PIL import Image import logging def pdf_to_images(pdf_path, output_dir, dpi=200): """ 将PDF每一页转换为图片 Args: pdf_path (str): PDF文件路径 output_dir (str): 图片输出目录 dpi (int): 输出图片分辨率 Returns: list: 生成的图片路径列表 """ if not os.path.exists(pdf_path): logging.error(f"PDF文件不存在: {pdf_path}") return [] os.makedirs(output_dir, exist_ok=True) image_paths = [] pdf_document = fitz.open(pdf_path) try: for page_num in range(len(pdf_document)): page = pdf_document.load_page(page_num) # 提高缩放矩阵以获得高清图片 zoom = dpi / 72 mat = fitz.Matrix(zoom, zoom) pix = page.get_pixmap(matrix=mat) img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples) output_path = os.path.join(output_dir, f"page_{page_num+1:03d}.png") img.save(output_path, 'PNG') image_paths.append(output_path) logging.info(f"已转换第 {page_num+1} 页 -> {output_path}") finally: pdf_document.close() return image_paths if __name__ == '__main__': # 示例用法 images = pdf_to_images('./input/report.pdf', './input/pdf_images') print(f"共转换 {len(images)} 张图片。")

注意:运行此脚本需要安装PyMuPDFPillow

pip install PyMuPDF Pillow

4.4 创建依赖文件与配置文件

创建requirements.txt,方便他人一键安装环境:

paddleocr>=2.7.0 paddlepaddle>=2.4.0 openpyxl>=3.0.0 pandas>=1.3.0 opencv-python>=4.5.0 PyMuPDF>=1.19.0 Pillow>=9.0.0

(可选)创建config.yaml,用于配置模型路径、语言等:

ocr: lang: "ch" # 识别语言:ch(中文)、en(英文)、fr等 use_angle_cls: true # 启用文字方向检测 use_gpu: false # 默认使用CPU det_model_dir: null # 自定义检测模型路径,null表示使用默认 rec_model_dir: null # 自定义识别模型路径 table_model_dir: null # 自定义表格模型路径 io: supported_image_ext: [".png", ".jpg", ".jpeg", ".bmp", ".tiff"] default_output_dir: "./output"

4.5 运行与验证

现在,让我们测试这个工具。

  1. 准备输入:在./input文件夹里放入几张包含表格的截图或图片(例如screenshot1.png)。
  2. 运行工具:在项目根目录打开命令行,执行:
    python main.py --input ./input --output ./output/excel/my_tables.xlsx
    如果想使用GPU加速(确保环境已配置好):
    python main.py --input ./input --output ./output/excel/my_tables.xlsx --gpu
  3. 处理PDF(如果需要):
    python utils/pdf_to_img.py # 然后将生成的 `./input/pdf_images` 文件夹作为输入 python main.py --input ./input/pdf_images --output ./output/excel/pdf_tables.xlsx
  4. 查看结果:打开./output/excel/my_tables.xlsx,你会看到每个识别出的表格都保存在独立的Sheet中,数据排列整齐,可以直接编辑和使用。

4.6 结果说明

工具运行成功后,你会在终端看到类似以下的日志:

2023-10-27 10:00:00 - INFO: PaddleOCR引擎初始化完成。 2023-10-27 10:00:05 - INFO: 处理文件: ./input/screenshot1.png 2023-10-27 10:00:08 - INFO: 正在处理第 1 个表格... 2023-10-27 10:00:10 - INFO: 表格 1 识别成功,形状: (5, 4) 2023-10-27 10:00:15 - INFO: 结果已成功保存至: ./output/excel/my_tables.xlsx

生成的Excel文件将完美还原图片中表格的结构和内容。

5. 常见问题与排查思路

在实际使用中,你可能会遇到以下问题。这里提供系统的排查思路。

问题现象可能原因解决思路
导入PaddleOCR报错1. 未安装paddleocrpaddlepaddle
2. Python版本不兼容(如3.10+)。
3. 依赖冲突。
1. 使用pip list检查包是否安装。
2. 降级Python到3.8/3.9。
3. 在虚拟环境中重新安装:python -m venv ocr_env,激活后重装。
识别速度非常慢1. 使用CPU运行,且图片分辨率高。
2. 未启用方向分类(use_angle_cls=False)导致误判重试。
3. 同时加载了不必要的模型(如多语言)。
1. 考虑使用GPU,或降低输入图片分辨率(如用OpenCV缩放)。
2. 确保use_angle_cls=True
3. 只加载需要的语言模型lang='ch'
表格结构识别混乱1. 图片质量差(模糊、倾斜、光照不均)。
2. 表格线太浅或为虚线。
3. 存在合并单元格。
1. 预处理图片:灰度化、二值化、纠偏。可使用OpenCV简单处理。
2. PaddleOCR对无线表格识别能力较弱,可尝试增强线条。
3. 合并单元格识别是难点,结果可能需要手动调整。
GPU可用但未加速1. PaddlePaddle未安装GPU版本。
2. CUDA/cuDNN版本不匹配或未安装。
3. 代码中use_gpu未设置为True
1. 重新安装paddlepaddle-gpu
2. 检查CUDA版本nvcc --version并与PaddlePaddle版本匹配。
3. 初始化时传入use_gpu=True
内存占用过高或溢出1. 图片尺寸过大。
2. 批量处理大量图片未及时释放内存。
1. 在处理前缩放图片:img = cv2.resize(img, (0,0), fx=0.5, fy=0.5)
2. 单张处理,并在处理完后使用del result或重启进程处理下一批。
无法识别英文或数字默认使用中文模型(lang='ch'),对纯英文场景非最优。切换语言:lang='en'或使用多语言模型lang='ch'(也支持英文)。对于中英文混合,'ch'即可。
pd.read_html解析失败PaddleOCR返回的HTML字符串可能格式不完全标准。1. 直接打印html_str查看原始输出。
2. 使用正则表达式或字符串处理手动解析HTML表格内容作为备用方案。

通用排查步骤

  1. 验证环境:运行python -c "import paddle; print(paddle.utils.run_check())"python -c "from paddleocr import PaddleOCR; print('PaddleOCR导入成功')"
  2. 简化输入:用一张最简单的、清晰的表格图片测试,排除图片本身问题。
  3. 查看日志:初始化时设置show_log=True,查看模型加载和识别过程的详细输出。
  4. 升级版本:使用pip install --upgrade paddleocr paddlepaddle更新到最新版本。

6. 最佳实践与工程建议

将工具投入实际生产或高频使用时,遵循以下建议可以提升稳定性、效率和体验。

6.1 图片预处理优化

在识别前对图片进行预处理,能极大提升精度。

import cv2 def preprocess_image(img_path): """对图片进行预处理""" img = cv2.imread(img_path) if img is None: return None # 1. 转为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 2. 二值化(自适应阈值效果更好) binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) # 3. 降噪(中值滤波) denoised = cv2.medianBlur(binary, 3) # 4. 可选:矫正倾斜(使用霍夫变换找直线,计算角度旋转) # ... 倾斜矫正代码较复杂,可根据需要添加 return denoised # 在recognize_single_image方法中,可以先预处理 processed_img = preprocess_image(img_path) # 注意:PaddleOCR.ocr() 也支持传入numpy数组 result = self.ocr.ocr(processed_img, cls=True)

6.2 性能与资源管理

  • GPU内存管理:处理大图时,即使使用GPU也可能内存不足。可以设置PaddlePaddle的显存分配策略。
    import paddle # 设置显存按需分配,而不是一次性占满 paddle.set_device('gpu') paddle.utils.run_check()
  • 批量处理与异步:对于大量图片,可以使用线程池或异步IO来提高I/O效率,但注意PaddleOCR模型本身不是线程安全的,建议使用多进程或顺序处理。
  • 模型热加载:如果需要在Web服务中长期运行,初始化一次PaddleOCR对象后重复使用,避免每次调用都重新加载模型。

6.3 结果后处理

OCR识别难免有误,加入后处理逻辑可提升数据可用性。

  • 数字格式化:识别出的“1,000”转为“1000”。
  • 日期归一化:将“2023年10月27日”、“2023-10-27”等统一为一种格式。
  • 空单元格判断:识别结果可能包含None或空字符串,需统一处理为NaN''
  • 置信度过滤:PaddleOCR返回的结果包含置信度分数,可以设定阈值(如低于0.8)进行标记或人工复核。

6.4 集成与自动化

  • 封装为API服务:使用 Flask 或 FastAPI 将核心功能包装成HTTP API,供其他系统调用。
    from fastapi import FastAPI, File, UploadFile import tempfile app = FastAPI() ocr_engine = TableOCR(use_gpu=False) @app.post("/recognize_table/") async def recognize_table(file: UploadFile = File(...)): with tempfile.NamedTemporaryFile(delete=False, suffix='.png') as tmp: tmp.write(await file.read()) tmp_path = tmp.name tables = ocr_engine.recognize_single_image(tmp_path) # 将DataFrame转为JSON返回 result = [df.to_dict(orient='records') for df in tables] return {"filename": file.filename, "tables": result}
  • 与工作流结合:使用Watchdog库监控特定文件夹,一旦有新图片放入,自动触发识别并保存结果到数据库或指定位置。
  • 生成报告:结合Jinja2等模板引擎,将识别出的数据自动填入Word或PDF报告模板。

6.5 安全与合规

  • 本地化部署:始终坚持离线运行,这是保障敏感数据安全的核心。
  • 输入验证:对用户上传的图片进行文件类型、大小检查,防止恶意文件。
  • 日志记录:记录操作日志,便于审计和问题追溯,但注意不要记录图片内容本身。
  • 权限控制:如果工具部署在共享环境,需对输入输出目录设置适当的访问权限。

7. 总结与扩展方向

通过本文的步骤,你已经成功搭建了一个功能强大、完全免费且离线的OCR表格识别提取工具。它不仅能处理常见的截图和扫描件,通过PDF转换模块也能应对电子文档,核心价值在于将非结构化的图片数据转化为可直接分析、编辑的结构化数据(Excel/CSV)。

回顾核心要点

  1. 环境搭建:正确安装Python、PaddlePaddle(CPU/GPU版)和PaddleOCR是第一步。
  2. 核心工具PaddleOCR类是核心,通过table=True参数启用表格识别能力。
  3. 项目化封装:将功能封装成类,支持命令行参数、批量处理和结果导出,提升了工具的实用性。
  4. 问题排查:针对速度、精度、环境等常见问题,有系统的解决路径。
  5. 最佳实践:图片预处理、后处理、性能优化和工程化集成能让工具更稳健高效。

下一步可以探索

  • 更复杂的版面分析:PaddleOCR也支持识别文档中的标题、段落、列表等,可以尝试构建一个完整的文档信息提取系统。
  • 自定义模型训练:如果针对特定格式的票据或表单(如发票、简历),识别效果不佳,可以收集数据,使用PaddleOCR提供的工具链训练自定义的检测和识别模型。
  • 界面化:使用PyQt、Tkinter或Streamlit为你的工具制作一个图形界面,方便非技术人员使用。
  • 云端备份与协作:在确保数据安全的前提下,可以将识别结果自动同步到私有云盘或数据库,实现团队协作。

工具的价值在于解决实际问题。现在,你可以立刻用它来处理积压的PDF报告、会议纪要截图,或者集成到你的数据采集流程中,亲身体验效率“翻倍”的畅快感。如果在使用过程中有新的发现或优化技巧,欢迎在社区分享交流。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 7:54:24

Codepilot SubAgent多模型配置:从原理到实践的AI编程助手优化指南

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

作者头像 李华
网站建设 2026/9/5 7:52:50

企业Agent协作平台赛道地图:从单Agent到多角色协同的工程实践

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

作者头像 李华
网站建设 2026/9/5 7:52:12

《数据结构与算法——递归与链表的基本概述与练习》

1. 链表的基本知识 (Linked List Basics) 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。课件中重点讲解了两种经典的链表操作题目: A. 反转链表 (Reverse Linked List) 目标:将单…

作者头像 李华
网站建设 2026/9/5 7:46:43

生成式 AI 驱动新型网络钓鱼威胁与企业防御路径研究

摘要 生成式人工智能技术降低了网络钓鱼攻击的技术门槛,攻击者可以批量生成语言流畅、风格高度贴合目标组织内部沟通范式的欺骗内容,传统依赖语法错误、表达怪异等表层特征识别钓鱼信息的防御逻辑已经失效。与此同时,设备代码钓鱼作为快速增…

作者头像 李华
网站建设 2026/9/5 7:46:33

如何在前端使用echarts?

1. 下载echarts.js文件方法一:直接在编辑器的终端输入以下命令:npm install echarts --save然后在node_modules/echarts/dist/文件夹下,就可以看到下载的echarts的js文件了。方法二:直接在echarts官网,找到下载&#x…

作者头像 李华
网站建设 2026/9/5 7:40:34

CCS魔神凯撒SKL新老版本模型对比:造型、可动与材质全解析

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

作者头像 李华