① 版权边界:本站内容均为公开资料整理 + 你的个人学习笔记,不收录任何需登录付费课程(如 atacollege)或盗版资源;请勿用于商业转载。
② 在线运行器限制:基于浏览器 Pyodide,已预装 NumPy / Pandas / Matplotlib;不支持 OpenCV、视频处理与读取你电脑本地真实文件,这类代码请复制到本地 VS Code 运行。
③ 进度存储:学习进度仅存本机浏览器,可用上方「⬇ 导出进度」备份,换设备用「⬆ 导入进度」恢复。
你好,零基础小伙伴 👋
这个平台为你量身打造:把「人工智能训练师」考试要考的东西,拆成能看懂、能记住、能上手的小块。下面是你给的目录,也是我们学习的顺序。
📍 你的学习路线图(对照你给的教学目录)
0-10 关递进语法卡逐行注释在线运行
只记忆自测题
翻转灰度标注流程
采集30%标注60%运维10%
真题填空必备函数
自由写代码即时出结果
🧭 怎么用这个平台(3 步闭环)
每个概念都有「这是什么 + 为什么 + 举例」,小白也能懂。
每个库都给你函数速查表,像背单词一样背下来。
点开真题卡,先想答案再点开看解析,错题反复刷。
📌 2026 年考试最新要求(先知道考什么)
- 等级:本项目只讲 五级/初级(国家新职业资格的入门级),不含中级/高级/技师级内容。
- 你当前考(五级/初级):理论(90分钟) + 实操(120分钟) 机考,两科均 ≥ 60 分合格。
- 合格线:每科 100 分,60 分及格,两科都及格才算过;单科合格保留 1 年,可补考 1 次。
- 理论题型:判断题(20题)、单选题(约60题)、多选题(20题)—— 都是客观题,机考作答。
- 实操题型:数据采集与整理(30%)、数据清洗(25%)、数据标注(40%)、操作规范(5%)—— 无复杂编程,侧重规范与工具。
Python + Pandas / SQLite 做数据采集、清洗、标注统计的代码填空(如客服会话采集、情感标注)。本平台「在线运行器」就是帮你练这个。十大理论模块 · 速记版
这 10 块是「只需要记忆」的理论知识。每块给出 重点卡片(背)和 自测题(点开看答案)。建议:先读卡片,合上书自测,错了再回看。
🚀 融合学习路径:从 0 基础到真题精通
这一条路把 Python 基础 + NumPy + Pandas + 数据可视化 + 深圳华必达六大实操考点 全部揉在一起,从「完全不会」一路练到「能写真题代码」。不用再翻前面四个基础模块,跟着关卡走到底即可。每一关都有:语法卡(新函数先给格式)、逐行中文注释、记忆口诀、联手案例和 ▶️ 在线运行。碰到英文单词(如 print、for、import)我会直接告诉你中文意思。
🔰 写代码前的「缩进」交通规则(先看一遍,后面每关都会重复)
Python 不用大括号,用缩进(前面空 4 个空格)来表示「这几行是一伙的」。新手 90% 的报错都是因为缩进错了。
# ✅ 正确示范:if 后面要加冒号,下一行缩进 4 个空格
if age >= 18:
print("成年") # 这行缩进了,属于 if 管
else: # else 和 if 对齐,不缩进
print("未成年") # else 管的内容再缩进
# ✅ 正确示范:for 后面也要加冒号,循环体缩进
for x in [1, 2, 3]:
print(x) # 缩进:在循环里,执行 3 次
print("结束") # 不缩进:循环跑完才执行 1 次
# ✅ 正确示范:def 函数后面加冒号,函数体缩进
def say_hello(name):
print("你好", name) # 缩进:属于函数内部
say_hello("小李") # 不缩进:调用函数,和 def 对齐
:冒号出现 → 下一行必须缩进 4 空格。- 同一个「队伍」的代码,左边要对齐。
- 想结束这个队伍 → 把下一行顶格写(和 if/for/def 对齐)。
- 不要混用 Tab 和空格,全用空格最保险。
阶段 0Python 第零课:变量、打印、注释(完全零基础)
这一关你只需要记住三件事:①print 显示结果 ②变量=盒子存数据 ③# 写注释。英语恐惧症先治好:print=打印(把结果打到屏幕上);name=名字(你给数据起的代号)。
变量名 = 值—— 把右边的值存进左边的"盒子"(变量)print(内容)—— 在屏幕上显示内容,多个内容用逗号,隔开,默认会自动加空格print(a, b, sep="")——sep是"分隔符",写成空字符串""就不加空格了# 这是注释—— 井号后面是说明文字,电脑不执行,方便你回忆
# print 默认:逗号会变成空格
print("年", "月", "日") # 输出:年 月 日(中间有空格)
# sep="" 去掉空格,=sep"" 紧密相连
print("年", "月", "日", sep="") # 输出:年月日(没有空格)
# sep 也可以换成别的符号
print("2026", "08", "15", sep="-") # 输出:2026-08-15
- 字符串必须用引号包起来:单引号
'或双引号"都可以,但不能只写一边。 - 变量=盒子:等号
=是「装进去」,不是数学里的相等;右边先算,结果装进左边。 - print 里面逗号会自动变空格;想不要空格,就加
sep=""。 - 注释以 # 开头,电脑不看,写给人看;写清楚你在算什么。
# print 英文=打印,意思是在屏幕上显示内容
print("你好,我是人工智能训练师")
# 变量:就是一个贴了名字的盒子,= 把右边的值装进左边的盒子
name = "小明" # 字符串(文字)用引号包起来
age = 18 # 数字直接写
print(name, "今年", age, "岁") # 多个内容用逗号隔开一起显示
# 注释:# 后面是给"人"看的说明,电脑会直接忽略,不会执行
# 计算:+加 -减 *乘 /除
total = 90 + 88 # 先算右边 178,再装进 total
print("两科总分:", total)
📖 逐行解释
- print(...) 就是"把括号里的内容念出来"给你看。
- = 不是数学里的相等,而是"赋值":把右边算好的结果装进左边盒子里。
- 字符串是用引号包起来的文字(如 "小明");数字直接写(如 18)。
- # 注释 是写给你自己看的笔记,考试和写代码时都要养成写注释的习惯。
把下面这段话写成代码并打印:你叫"小红",今年 20 岁,请显示"小红 年龄 20"。
name = "小红"
age = 20
print(name, "年龄", age)- 定义变量 price = 3.5,quantity = 4,计算总价 total 并打印。
- 用一条 print 同时输出自己的姓、名和年龄,中间用空格分开。
- 写注释说明下面一行是计算长方形面积:长 5,宽 3。
- 用
sep=""输出 "2026年08月15日"(不给空格)。 - 定义 a=7, b=3,打印 "7+3=10" 注意等号两边没有空格。
▶️ 在线运行:阶段 0 · 变量与打印
阶段 1数据类型:列表、字典、布尔(记事本升级)
电脑里有几种"容器":列表像一排带编号的储物柜,字典像姓名贴标签的抽屉,布尔只有"真/假"两种状态。关键英文:list=列表/清单,dict=字典,len=length/长度。
列表 = [值1, 值2, ...]—— 一排数据;用列表[编号]取,编号从 0 开始列表[-1]—— 反取最后一个;列表[-2]反取倒数第二个字典 = {"标签": 值, ...}—— 用字典["标签"]取值;标签必须用引号len(列表/字典)—— 量长度/数个数,经常和 if 一起用if len(列表) > 2:—— 先量长度,再判断,否则 Python 会懵
# 反取值:从后面倒着拿
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
print("最后一个:", fruits[-1]) # 葡萄
print("倒数第二个:", fruits[-2]) # 橙子
# len 像一把尺子:先量长度,才能判断
scores = [78, 92, 56]
if len(scores) > 2: # 先数有几个,再判断是否超过 2
print("成绩超过 2 条")
else:
print("成绩不够 2 条")
# 字典标签必须加引号;取值用中括号 [ ]
info = {"name": "小李", "age": 22}
print(info["name"]) # 小李
- 列表用中括号
[ ],里面元素用逗号分开;取第 1 个写[0],取最后写[-1]。 - 字典用大括号
{ },格式是"标签": 值,标签必须加引号。 - 取值也用中括号:列表用编号
list[0],字典用标签dict["name"]。 - 判断长度要先 len():不能直接写
if scores > 2,要写if len(scores) > 2。
# 列表 list(英文=清单):一排带编号的盒子,用中括号 [ ]
scores = [78, 92, 56, 88, 61] # 5 个成绩,编号从 0 开始
print("第一个成绩:", scores[0]) # 取第 1 个(编号0)→ 78
print("成绩个数:", len(scores)) # len=length 长度,共 5 个
# 字典 dict(英文=字典):用"标签"而不是编号来取,像姓名贴
stu = {"name": "小明", "score": 88, "city": "深圳"}
print("姓名:", stu["name"]) # 用标签 "name" 取 → 小明
stu["score"] = 95 # 修改标签对应的值
print("改后分数:", stu["score"])
# 布尔 bool(英文=真假):只有 True(真)和 False(假)
print(78 >= 60) # 78 不小于 60 → True(及格)
📖 逐行解释
- scores[0] 取第一个元素,因为编号从 0 开始(0=第1个,1=第2个…)。
- len(scores) 返回列表中元素个数。
- 字典 用 stu["name"] 按标签取;改值时写 stu["score"] = 95。
- 78 >= 60 是比较,结果是 True 或 False(布尔值),后面条件判断会天天用。
创建一个字典记录你的信息:姓名"小李"、年龄 22、城市"广州",并打印出年龄。
info = {"name": "小李", "age": 22, "city": "广州"}
print("年龄:", info["age"])- 创建一个列表 cities = ["北京","上海","广州"],打印最后一个城市。
- 给上面的 stu 字典增加一个"phone"键,值为"13800138000",再打印。
- 判断列表 [3,1,4,1,5] 的长度是否大于 3,打印 True/False。
- 取列表 [10,20,30,40] 的最后一个元素和倒数第二个元素。
- 字典
{"A":90,"B":80,"C":70},打印 B 对应的值(用dict["B"])。
▶️ 在线运行:阶段 1 · 列表与字典
阶段 2 ⭐条件、循环与计数(华必达第 1 关)
题目:给定成绩列表,完成①逐个输出②输出及格成绩③统计通过人数;挑战分段统计。这是真题第一关。关键英文:for=对于每一个,if=如果,elif=否则如果,else=否则。
for 元素 in 列表:—— 依次把列表里每个值交给"元素",循环执行缩进块if 条件:—— 条件成立(True)才执行下面缩进块elif 条件:—— 上面 if 不成立时,再判断这个条件else:—— 上面所有条件都不成立时执行计数 += 1—— 计数器加 1,等于 计数 = 计数 + 1
scores = [78, 92, 56, 88, 61]
# 1. 逐个输出(for=对于每一个)
print("=== 所有成绩 ===")
for s in scores: # s 依次取到 78,92,56...
print(s)
# 2. 只输出及格(>=60)的
print("=== 及格成绩 ===")
for s in scores:
if s >= 60: # if=如果,条件成立才执行缩进块
print(s)
# 3. 统计通过人数(计数器三步走)
pass_count = 0 # ① 先归零
for s in scores:
if s >= 60:
pass_count += 1 # ② 满足条件加 1(+= 即 =自身+1)
print("通过人数:", pass_count) # ③ 循环外打印结果
# 挑战:分段统计
high = mid = low = 0
for s in scores:
if s >= 90:
high += 1 # 优秀
elif s >= 60: # elif=否则如果
mid += 1 # 及格
else:
low += 1 # 不及格
print("优秀/及格/不及格:", high, mid, low)
📖 逐行解释
- for s in scores:s 是临时变量,每次循环自动取下一个成绩。
- if s >= 60:只有及格才打印;注意 >= 是"大于等于"。
- 计数器固定写法:循环外先 pass_count = 0,循环内满足条件 pass_count += 1,循环外再打印。
- elif/else 自上而下判断,进了一个分支就跳过其余,所以先写高分再写低分避免重叠。
- for 后面必须加冒号
for x in 列表:,循环体缩进 4 空格。 - if 后面必须加冒号
if 条件:,条件成立才执行下面缩进的代码。 - else 不能单独写条件,它是「上面所有 if/elif 都不成立时才执行」。
- 计数器三步走:① 循环外清零 ② 循环内满足条件加 1 ③ 循环外打印。
- elif 顺序很重要:先判断高分,再判断低分,避免一个成绩被重复计数。
把及格线改成 70 分,统计 70 分及以上人数,并输出所有不及格成绩。
scores = [78, 92, 56, 88, 61]
cnt = 0
for s in scores:
if s >= 70:
cnt += 1
else:
print("不及格:", s)
print("70分以上人数:", cnt)n % 2 == 0—— % 是「取余数」:n 除以 2 余 0 就是偶数,余 1 就是奇数。例:10 % 2 == 0为真,7 % 2 == 1为真。len(文本)或len(列表)—— 返回长度 / 个数。例:len("hello")得 5,len([1,2,3])得 3。max(列表)/min(列表)—— 直接返回最大值 / 最小值。例:max([78,92,56])得 92。range(1, 11)—— 生成 1~10(左闭右开,结尾要 +1 才是 10)。配for i in range(1,11):遍历。
- ① 给定 nums=[45,72,33,88,90],统计 ≥ 80 的有几个。计数三步走:清零 → 循环里
if n>=80就 +1 → 打印。nums=[45,72,33,88,90] c=0 for n in nums: if n>=80: c+=1 print("≥80的个数:",c) # 结果 3 - ② 遍历 1 到 10,打印所有偶数。用
range(1,11)遍历,n%2==0即偶数。for i in range(1,11): if i%2==0: print(i) # 2 4 6 8 10 - ③ 统计一个字符串列表中长度 > 3 的单词个数。用
len(w)求每个词长度,>3 就计数。words=["cat","apple","dog","banana"] c=0 for w in words: if len(w)>3: c+=1 print("长度>3的词数:",c) # 结果 2 - ④ 给定成绩,输出最高分、最低分。直接用内置
max()/min()。scores=[78,92,56,88,61] print("最高分:",max(scores)) # 92 print("最低分:",min(scores)) # 56 - ⑤ 把列表 [1,2,3,4,5,6] 中奇数打印出来,偶数跳过。
n%2==1是奇数就打印;偶数用continue跳过(或直接 if 只打印奇数)。nums=[1,2,3,4,5,6] for n in nums: if n%2==1: print(n) # 1 3 5
▶️ 在线运行:阶段 2 · 条件、循环与计数
🧩 综合闯关 · 阶段 1-2(变量 + 列表 + 条件循环)
给定成绩列表,要求:① 用 print 输出总人数 ② 统计及格/不及格人数 ③ 若及格人数超过总数一半,打印「通过率高」。
scores = [88, 45, 92, 60, 35, 78]
# 1. 量长度
n = len(scores)
print("总人数:", n)
# 2. 计数器
ok = 0
for s in scores:
if s >= 60:
ok += 1
else:
print("不及格:", s)
print("及格人数:", ok)
# 3. len 必须先有,才能判断
if ok > n / 2:
print("通过率高")
else:
print("通过率一般")
💡 考点:变量、列表、for、if/else、计数器、len 判断。
阶段 3 ⭐⭐字符串、列表与函数(华必达第 2 关)
题目:筛选列表里的 Python 文件(忽略大小写 .PY/.py 都算),并升级成通用筛选函数。关键英文:def=define/定义,return=返回(交回结果),lower=变小写,endswith=以…结尾,append=追加。
def 函数名(参数):—— 定义一个可复用的代码块,参数就是"输入原料"return 结果—— 把算好的结果交回给调用处(没有 return 函数不返回东西)字符串.lower()—— 把字符串全部转成小写,实现"大小写不敏感"字符串.endswith("后缀")—— 判断字符串是否以指定后缀结尾,返回 True/False列表.append(元素)—— 把元素加进列表末尾
files = ["lesson1.PY", "lesson2.py", "photo.jpg", "readme.TXT", "exercise.py"]
# 必做:返回所有 Python 文件(忽略大小写)
def find_python_files(files): # def=定义函数;files 是参数(输入)
result = [] # 先准备一个空列表装结果
for name in files:
if name.lower().endswith(".py"): # lower=变小写; endswith=以...结尾
result.append(name) # append=追加(加进列表末尾)
return result # return=把结果交回去
# 挑战:通用筛选(同一个函数既能筛 .py 也能筛 .txt)
def find_files(files, extension):
result = []
for name in files:
if name.lower().endswith(extension.lower()):
result.append(name)
return result
print("Python 文件:", find_python_files(files))
print("文本文件:", find_files(files, ".txt"))
📖 逐行解释
- def 像"榨汁机":放进原料(files),里面处理,最后 return 吐出果汁(结果)。
- name.lower() 先把 "lesson1.PY" 变成 "lesson1.py",再判断是否以 ".py" 结尾,这样 .PY 也能识别。
- result = [] 是空结果盒,用 .append() 把符合要求的名字一个个装进去。
- 挑战版把扩展名也 .lower(),所以调用时写 ".py" 或 ".txt" 都能用。
- 函数像一台机器:用
def 函数名(参数):造机器,参数就是进料口。 - return 是出口:把结果「吐」出来;没 return 函数只是执行,不会给你返回值。
- 字符串方法要加小括号:
.lower()、.strip()、.split(","),括号不能丢。 - 比较时先统一大小写:文件名判断用
name.lower().endswith(".py"),避免.PY漏掉。
写一个函数 count_py(files),只返回 Python 文件的数量(不是列表)。
files = ["a.py", "b.txt", "c.PY", "d.md"]
def count_py(files):
n = 0
for name in files:
if name.lower().endswith(".py"):
n += 1
return n
print("Python 文件数:", count_py(files))- 写一个函数 get_initials(name) 把姓名首字母取出来(如 "张三"→"ZS")。
- 把字符串 " Hello World " 去掉首尾空格并转成大写。
- 用 split 把 "苹果,香蕉,橙子" 切成列表并打印。
- 写一个函数,输入字符串,返回它是不是以 ".jpg" 结尾(不区分大小写)。
- 把文件名 "Report.FINAL.PDF" 变成全小写并判断是否以 ".pdf" 结尾。
▶️ 在线运行:阶段 3 · 字符串、列表与函数
阶段 4 ⭐⭐文件夹遍历与分类统计(华必达第 3 关)
题目:遍历一个文件夹,按扩展名把文件分成 image/text/web/other 四类并计数。关键英文:import=导入(拿工具),os=操作系统,listdir=列出目录,splitext=split extension/拆分扩展名。
import 模块名—— 引入一个工具包,才能使用里面的功能(如 import os)os.listdir(文件夹)—— 返回该文件夹里所有文件名的列表_, 后缀 = os.path.splitext(文件名)—— 把"名字.后缀"切开,_ 接前半段(不要),后缀 接 .jpg 这类os.path.join(路径, 名)—— 用系统正确方式拼接路径(Windows/Linux 都安全)
import os # import=导入;os 是操作系统模块(处理文件和文件夹)
# 先造一个虚拟文件夹和示例文件,模拟真实环境
os.makedirs("./files", exist_ok=True) # makedirs=建目录; exist_ok=True 已存在也不报错
for name in ["a.jpg", "b.PNG", "c.gif", "note.txt", "index.html", "script.py"]:
open(os.path.join("./files", name), "w", encoding="utf-8").close()
# 核心:按扩展名分类统计
def scan_materials(folder):
counts = {"image": 0, "text": 0, "web": 0, "other": 0}
for filename in os.listdir(folder): # listdir=列出文件夹内所有文件名
_, ext = os.path.splitext(filename) # splitext=切开文件名和后缀; _ 表示"我不要前半段"
ext = ext.lower()
if ext in {".jpg", ".jpeg", ".png", ".gif"}:
counts["image"] += 1
elif ext in {".txt", ".md"}:
counts["text"] += 1
elif ext in {".html", ".htm"}:
counts["web"] += 1
else:
counts["other"] += 1
return counts
result = scan_materials("./files")
print("图片/文本/网页/其他:", result)
📖 逐行解释
- import os 后才有 os.listdir / os.path 等文件操作能力。
- os.path.splitext("a.jpg") 返回 ("a", ".jpg");用 _, ext 接收,下划线 _ 是约定"这截我不用"。
- ext in {".jpg",".png"} 用集合判断扩展名,比一长串 or 更干净。
- 字典 counts 保存各类数量,满足哪类就 counts[类名] += 1。
- 遍历文件夹用
os.listdir("路径"),它返回该目录下所有文件/文件夹的名字列表。 - 拆分文件名和后缀用
os.path.splitext(name),返回("名字", ".后缀")。 - 拼接路径用
os.path.join(目录, 文件名),Windows 和 Mac/Linux 都能用。 - 判断类别前先 lower():防止
.JPG和.jpg被当成两种格式。
统计一个文件夹里一共有多少个 .py 文件(用刚学的遍历)。
import os
os.makedirs("./code", exist_ok=True)
for n in ["x.py", "y.txt", "z.py"]:
open(os.path.join("./code", n), "w").close()
cnt = 0
for f in os.listdir("./code"):
if f.lower().endswith(".py"):
cnt += 1
print("py 文件数:", cnt)os.rename(旧名, 新名)—— 给文件改名;配合os.path.splitext把后缀换成 .bak。os.path.isfile(路径)/os.path.isdir(路径)—— 判断是「文件」还是「文件夹」,返回 True/False。max(列表, key=len)—— 按「长度」找最长的;key=len表示比的是长度而非大小。
- ① 遍历 ./files 目录,把所有 .txt 文件改名为 .bak。用 splitext 拆后缀,再 os.rename 改名。
import os for name in os.listdir("./files"): if name.lower().endswith(".txt"): base, _ = os.path.splitext(name) os.rename(os.path.join("./files", name), os.path.join("./files", base + ".bak")) - ② 统计当前目录下文件总数和文件夹总数。用 isfile / isdir 判断每个条目。
import os files = dirs = 0 for name in os.listdir("."): if os.path.isfile(name): files += 1 elif os.path.isdir(name): dirs += 1 print("文件:", files, "文件夹:", dirs) - ③ 找出当前目录下文件名最长的文件并打印。max 配合 key=len 按长度取最大。
import os names = os.listdir(".") longest = max(names, key=len) print("最长文件名:", longest, "长度:", len(longest)) - ④ 遍历 ./files,按 .jpg / .png / 其他 三类分别计数。三类各自独立的 if/elif 判断。
import os jpg = png = other = 0 for name in os.listdir("./files"): _, ext = os.path.splitext(name); ext = ext.lower() if ext == ".jpg": jpg += 1 elif ext == ".png": png += 1 else: other += 1 print("jpg:", jpg, "png:", png, "其他:", other) - ⑤ 把 ./files 下所有 .txt 文件路径打印出来(用 os.path.join 拼接)。join 拼出完整路径再打印。
import os for name in os.listdir("./files"): if name.lower().endswith(".txt"): print(os.path.join("./files", name))
▶️ 在线运行:阶段 4 · 文件夹遍历与分类统计
🧩 综合闯关 · 阶段 1-4(字符串 + 函数 + 文件分类)
写一个函数 count_files(folder, ext),统计指定文件夹里指定后缀的文件数量(不区分大小写),并返回结果。
import os
def count_files(folder, ext):
"""统计 folder 下后缀为 ext 的文件个数(ext 如 .py)"""
n = 0
for name in os.listdir(folder):
# 反取后缀并统一小写
_, e = os.path.splitext(name)
if e.lower() == ext.lower():
n += 1
return n
# 测试:在当前目录统计 .py 文件
print("py 文件数:", count_files(".", ".py"))
💡 考点:def 函数、return、os.listdir、os.path.splitext、.lower()、计数器、for/if。
- 函数格式:
def 名字(参数1, 参数2):,下一行缩进。 - 取后缀固定套路:
_, ext = os.path.splitext(name),下划线表示「名字我不要」。 - 不区分大小写:两边都
.lower()后再比较。 - 循环外清零,循环内加 1,函数末尾 return。
阶段 5 ⭐⭐NumPy 数组:批量计算的神器
NumPy 是人工智能必用的"数组计算库"。它把数据排成方格纸,能一次性对整个表做运算,比一个一个循环快得多。关键英文:array=数组,shape=形状,axis=轴(方向),max=最大,arg=参数/下标。
import numpy as np—— 导入 NumPy 并起小名 np(行业约定,必背)np.array([[...],[...]])—— 用嵌套列表创建二维数组(多行多列)数组.shape—— 查看数组是几行几列,返回 (行数, 列数)数组[行, 列]—— 按位置取元素,编号从 0 开始np.max(数组) / np.argmax(数组)—— 求最大值 / 求最大值所在的位置下标
import numpy as np # numpy 是"数组计算库";np 是大家约定的小名(缩写)
# 创建数组(像一张方格纸,用 [行, 列] 定位)
a = np.array([[1, 2, 3],
[4, 5, 6]])
print("数组内容:\n", a)
print("形状(几行几列):", a.shape) # shape=形状
print("第0行第1列:", a[0, 1]) # 取 2
# 数组运算:整张表一次性算,不用写循环
print("全部乘 10:\n", a * 10)
print("每列求和:", a.sum(axis=0)) # axis=0 按列;axis=1 按行
# 找最大值和位置
m = np.array([3, 9, 1, 7])
print("最大值:", np.max(m)) # max=最大
print("最大值位置:", np.argmax(m)) # argmax=最大值的"下标"
# 变形:把 1 行 9 列 改成 3 行 3 列
flat = np.array([1,2,3,4,5,6,7,8,9])
print("重塑为3x3:\n", flat.reshape(3, 3))
📖 逐行解释
- np.array(...) 把列表变成 NumPy 数组,支持整体运算。
- a.shape 告诉你尺寸,如 (2, 3) 表示 2 行 3 段。
- a * 10 会把每个格子都乘 10,不用写 for 循环——这就是 NumPy 的强大之处。
- np.argmax 返回"最大值在第几个位置",后面做图像分类、找最像的标签会用到。
- 数组是一群同类型的数,用
np.array([...])创建,比 Python 列表算得快。 - reshape 改变形状:
arr.reshape(行, 列),总个数必须不变。 - 整表运算不用写循环:
arr + 10会给每个元素都加 10。 - argmax 找最大值的「位置」,max 找最大值本身。
一张 2x2 的灰度图(数值=亮度),求整张图的平均亮度。
import numpy as np
img = np.array([[100, 120],
[80, 200]])
print("平均亮度:", img.mean()) # mean=平均值np.zeros((行, 列))—— 创建全 0 数组(dtype 可指定 int/float)。np.random.rand(n)—— 生成 n 个 0~1 之间的随机小数。- 对角线赋值:用下标
a[i, i] = 1逐格填,或np.fill_diagonal(a, 1)一键填。
- ① 创建数组 [1,2,3,4,5,6],reshape 成 2 行 3 列。reshape 总个数不变(6=2×3)。
import numpy as np a = np.array([1,2,3,4,5,6]) print(a.reshape(2, 3)) - ② 生成 10 个 0 到 1 之间的随机数并求平均值。np.random.rand 出随机数组,用 .mean() 求平均。
import numpy as np r = np.random.rand(10) print("随机数:", r) print("平均值:", r.mean()) - ③ 找出数组 [12,5,8,21,3] 中最大值的位置。argmax 返回「下标」不是值。
import numpy as np print("最大值位置:", np.argmax([12,5,8,21,3])) # 得 3(第4个) - ④ 创建一个 3x3 全 0 数组,再把对角线改成 1。先 zeros,再用下标 i,i 填 1。
import numpy as np a = np.zeros((3,3), dtype=int) for i in range(3): a[i, i] = 1 print(a) # 对角线为 1 - ⑤ 把数组 [10,20,30,40] 每个元素都除以 10,看结果。整表运算,不用写循环。
import numpy as np a = np.array([10,20,30,40]) print(a / 10) # [1. 2. 3. 4.]
▶️ 在线运行:阶段 5 · NumPy 数组基础
🧩 综合闯关 · 阶段 1-5(列表 + 循环 + NumPy 批量计算)
有一组成绩,先过滤掉 0 分(缺考),再求平均分、最高分、最低分。
import numpy as np
scores = [78, 0, 92, 56, 0, 88, 61]
# 1. 用 Python 列表先过滤(还没学到 Pandas 时)
clean = []
for s in scores:
if s != 0: # != 表示"不等于"
clean.append(s) # append 把元素塞到列表末尾
print("有效成绩:", clean)
# 2. 转成 NumPy 数组做批量统计
arr = np.array(clean)
print("平均分:", arr.mean())
print("最高分:", arr.max())
print("最低分:", arr.min())
💡 考点:列表过滤、for/if、append、np.array、mean/max/min。
- 新建空列表:
clean = []。 - 往列表加东西:
clean.append(值)。 - "不等于"写
!=,不是<>。 - NumPy 数组算整表:先
np.array(列表),再调方法。
阶段 6 ⭐⭐⭐字典、JSON 与异常处理(华必达第 4 关)
题目:读取标注结果文件 labels.json,统计每个标签出现次数并保存为 count.json,同时处理"文件不存在/格式错误"。关键英文:json=数据交换格式,try/except=试一试/救一救,open=打开,dump/load=倒出/读入,get=取。
import json—— 导入 JSON 模块才能读写 .json 文件with open(路径, "r", encoding="utf-8") as f:—— 打开文件读(r)/写(w),with 结束自动关闭json.load(f)—— 从文件把 JSON 读成 Python 的列表/字典json.dump(对象, f, ensure_ascii=False, indent=2)—— 把 Python 对象写进 JSON;ensure_ascii=False 保中文try: ... except 错误名:—— try 里可能出错,except 捕获指定错误并优雅地处理
import json # json 是一种"键值对"文本格式,常用于存标注结果
# 先造一份示例标注文件 labels.json
sample = [
{"name": "img001.jpg", "label": "cat"},
{"name": "img002.jpg", "label": "dog"},
{"name": "img003.jpg", "label": "cat"},
{"name": "img004.jpg", "label": "cat"},
{"name": "img005.jpg", "label": "dog"}
]
with open("labels.json", "w", encoding="utf-8") as f: # with=自动关文件
json.dump(sample, f, ensure_ascii=False, indent=2) # dump=倒出(写入)
# 核心:读文件→统计每个标签次数→保存结果(带异常处理)
def count_labels(path):
try: # try=试一试
with open(path, "r", encoding="utf-8") as f:
data = json.load(f) # load=读入
except FileNotFoundError: # except=如果出错就救场
print("文件不存在:", path)
return {}
except json.JSONDecodeError:
print("JSON 格式错误")
return {}
counts = {}
for item in data:
label = item.get("label", "未知") # get=取,没有就给默认值"未知"
counts[label] = counts.get(label, 0) + 1
return counts
def save_counts(counts, out_path):
with open(out_path, "w", encoding="utf-8") as f:
json.dump(counts, f, ensure_ascii=False, indent=2)
counts = count_labels("labels.json")
save_counts(counts, "count.json")
print("统计结果:", counts)
print("--- count.json 内容 ---")
print(open("count.json", encoding="utf-8").read())
📖 逐行解释
- try/except 是"安全网":文件缺失或格式坏掉时,程序不会崩溃,而是打印提示并返回空字典。
- with open 不用手动 f.close(),用完自动关,最稳妥。
- item.get("label", "未知") 防止某些数据缺 label 键导致报错。
- counts.get(label, 0) 第一次遇到某标签时默认从 0 起算再 +1。
- JSON 是「字符串版的字典」,适合存文件;用
json.load(f)读,json.dump(obj, f)写。 - 写中文要加 ensure_ascii=False,否则中文会变成
\uXXXX乱码。 - 用 with open 自动关门,不用手动写 f.close()。
- try/except 是「保险」:try 里放可能出错的代码,except 里放出错后的处理。
读取上面的 labels.json,只统计出 "cat" 标签出现了几次。
import json
data = json.load(open("labels.json", encoding="utf-8"))
n = 0
for item in data:
if item.get("label") == "cat":
n += 1
print("cat 出现:", n, "次")- 读取一个 JSON 文件,若文件不存在则打印"文件未找到"。
- 把字典 {"a":1,"b":2} 写入 data.json,并验证能读回来。
- 写一段代码:尝试把 input 转成整数,失败时提示请输入数字。
- 读取 JSON 标注文件,统计每个类别出现的次数并打印。
- 把字典写入 JSON,再用 with open 读回来,验证内容一致。
▶️ 在线运行:阶段 6 · 字典、JSON 与异常处理
阶段 7 ⭐⭐⭐Pandas:像用 Excel 一样处理数据
Pandas 是人工智能训练师处理表格数据最常用工具,能读 csv、清洗空值、按组算统计。关键英文:DataFrame=数据框(整张表),Series=一列,read_csv=读表格,dropna=丢空值,groupby=分组。
import pandas as pd—— 导入并起小名 pd(必背)pd.read_csv("文件.csv")—— 读取 CSV 文件成 DataFrame 表格df.head()—— 查看前几行,快速预览数据df.dropna()—— 删除含有空值(NaN)的行,数据清洗第一招df.groupby("列")["数值列"].mean()—— 按某列分组,对数值列求平均
import pandas as pd # pandas 是"表格处理库";pd 是约定小名
# 用字典造一张小表(模拟成绩单 csv)
data = {
"name": ["小明", "小红", "小刚", "小美", "小强"],
"class": ["A", "A", "B", "B", "A"],
"score": [88, 92, None, 75, 60] # None=空值(缺失)
}
df = pd.DataFrame(data) # DataFrame=二维表格(像 Excel)
print("=== 原表 ===")
print(df)
# 数据清洗:删掉有空值的行
df_clean = df.dropna() # dropna=丢掉空值
print("\n=== 清洗后(删空行) ===")
print(df_clean)
# 按班级分组,算每个班的平均分
avg = df.groupby("class")["score"].mean() # groupby=分组; mean=平均
print("\n=== 各班平均分 ===")
print(avg)
📖 逐行解释
- pd.DataFrame(data) 把字典变成一张带列名的表。
- None 表示缺失值;dropna() 直接删掉含缺失的行(清洗脏数据)。
- groupby("class") 按班级把行分成几组,再对 score 求 mean(平均)。
- 实际考试常给 .csv 文件,你只需 df = pd.read_csv("成绩.csv") 就能开始处理。
- DataFrame 就是表格,行是记录,列是字段;用
df["列名"]取一列。 - 缺失值处理:
df.isnull()查空洞,df.dropna()删空行,df.fillna(值)填空。 - 分组统计:
df.groupby("分类列")["数值列"].mean(),先分组再算账。 - 读 csv 用
pd.read_csv("文件"),读 Excel 用pd.read_excel("文件")。
读取上面的 df,给每人加一列"加分"=10,再算所有人 score 的总和(提示:用 df["score"].sum())。
import pandas as pd
df = pd.DataFrame({"name":["甲","乙","丙"], "score":[80,90,70]})
df["bonus"] = 10
print(df)
print("总分:", df["score"].sum()) # sum=求和df.drop_duplicates()—— 整张表去重;df["列"].drop_duplicates()对某列去重。- 新列带条件:用
np.where(条件, 满足值, 否则值)批量判断(可嵌套)。 df.to_excel("文件.xlsx", index=False)—— 导出 Excel(考试环境一般已装 openpyxl)。
- ① 读取 data.csv,删除所有缺失值所在的行。dropna 删空行(本关已学)。
import pandas as pd df = pd.read_csv("data.csv") df_clean = df.dropna() print(df_clean) - ② 按"班级"分组,计算"成绩"的平均分。groupby + mean(本关已学)。
import pandas as pd avg = df.groupby("班级")["成绩"].mean() print(avg) - ③ 把 DataFrame 中某列的重复行去掉。用 drop_duplicates 去重。
import pandas as pd uniq = df["某列"].drop_duplicates() print(uniq) - ④ 给 DataFrame 新增一列 "等级":score>=90 为优秀,60-89 为及格,否则不及格。用 np.where 嵌套判断。
import pandas as pd, numpy as np df["等级"] = np.where(df["score"]>=90, "优秀", np.where(df["score"]>=60, "及格", "不及格")) print(df) - ⑤ 把清洗后的 DataFrame 保存为 Excel 文件。to_excel 导出,index=False 不导出行号。
import pandas as pd df.to_excel("clean.xlsx", index=False) print("已保存")
▶️ 在线运行:阶段 7 · Pandas 数据清洗与分组
🧩 综合闯关 · 阶段 1-7(CSV + Pandas 清洗 + 统计)
读取 CSV,删除缺失行,按城市分组求平均成绩,并保存结果。
import pandas as pd
# 假设已有 data.csv,这里用字符串模拟
from io import StringIO
csv_text = """name,city,score
小李,深圳,88
小王,广州,92
小张,深圳,75
小赵,北京, """
df = pd.read_csv(StringIO(csv_text)) # 读入表格
print("原始行数:", len(df))
df = df.dropna() # 删除有空值的行
print("清洗后行数:", len(df))
result = df.groupby("city")["score"].mean() # 按城市分组算平均
print(result)
# 保存
df.to_csv("clean.csv", index=False)
print("已保存 clean.csv")
💡 考点:pd.read_csv、dropna、groupby、mean、to_csv、len 判断。
- 读 CSV:
df = pd.read_csv("文件")。 - 删空行:
df = df.dropna()(注意要重新赋值给 df)。 - 分组求平均:
df.groupby("分类列")["数值列"].mean()。 - 保存:
df.to_csv("新文件", index=False),index=False 防止多出一列序号。
阶段 8 ⭐⭐⭐图片读取与多图显示(华必达第 5 关 · 浏览器演示版)
题目:用 OpenCV 读图→转 RGB→Matplotlib 显示;挑战批量读取并显示。因浏览器装不了 OpenCV,下面用 NumPy 造两张模拟图演示显示流程。关键英语:imread=读图,cvtColor=转换颜色,imshow=显示图,subplot=子图。
cv2.imread(路径)—— OpenCV 读图,默认是 BGR(蓝绿红) 顺序cv2.cvtColor(img, cv2.COLOR_BGR2RGB)—— 把 BGR 转成 RGB,否则颜色发蓝发紫plt.imshow(图)—— 用 Matplotlib 把数组/图片画出来plt.subplot(行, 列, 位置)—— 把画面分成几格,指定当前画哪一格
# 本地真实写法(复制到 VS Code 运行):
import cv2, glob
import matplotlib.pyplot as plt
img = cv2.imread("data/cat.jpg") # 读图(BGR)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 转 RGB
plt.imshow(img_rgb); plt.axis("off"); plt.show()
# 批量显示
files = sorted(glob.glob("data/*.jpg")) # glob=按通配符找文件
fig, axes = plt.subplots(1, len(files), figsize=(12,4))
for ax, p in zip(axes, files):
ax.imshow(cv2.cvtColor(cv2.imread(p), cv2.COLOR_BGR2RGB))
ax.axis("off")
plt.show()
📖 逐行解释
- OpenCV 默认 BGR 顺序,而 Matplotlib 按 RGB 显示,所以必须 cvtColor 转换,否则图片发蓝。
- cv2.imread 失败返回 None,正式代码要加 if img is None 判断。
- plt.subplots(1, N) 一行 N 列,配合 for 循环把每张图塞进不同子图。
- 下面浏览器演示版用 NumPy 造图,道理完全一样:imshow 负责显示。
- OpenCV 默认读图顺序是 BGR(蓝绿红),Matplotlib 要 RGB,所以显示前要做
cvtColor转换。 - 图片本质是数组:彩色图是
(高, 宽, 3)的三维数组,灰度图是二维。 - 浏览器里不能装 OpenCV,本关先用 NumPy 模拟流程;真实图片请复制代码到本地 VS Code 跑。
用 NumPy 造一张 50x50 的全蓝图片(三通道都设蓝=255)。
import numpy as np
import matplotlib.pyplot as plt
blue = np.zeros((50, 50, 3), dtype=np.uint8)
blue[:, :, 2] = 255 # 第3通道(蓝)全亮
plt.imshow(blue); plt.axis("off"); plt.show()np.random.rand(高, 宽)—— 造一张随机灰度图(值 0~1)。- 取通道:
img[:, :, 0]=蓝(B)、[:,:,1]=绿(G)、[:,:,2]=红(R)(OpenCV 是 BGR 顺序)。 - 裁剪:
img[行起:行止, 列起:列止]切出一块区域。
- ① 用 NumPy 创建一个 100×100 的随机灰度图并显示。rand 造图,cmap="gray" 灰度显示。
import numpy as np, matplotlib.pyplot as plt img = np.random.rand(100, 100) plt.imshow(img, cmap="gray"); plt.show() - ② 把一张彩色图的红、绿、蓝三个通道分别打印出来。用 cv2.split 或下标切片取通道。
import cv2 b, g, r = cv2.split(img) # 或 img[:,:,0] 等 print("蓝通道:\n", b) - ③ 把图片从中心裁剪出 100×100 区域并保存。先算中心起点,再切片。
import numpy as np h, w = img.shape[:2]; s = 100 top, left = (h-s)//2, (w-s)//2 crop = img[top:top+s, left:left+s] - ④ 用 NumPy 生成一张 200x200 的灰度渐变图并显示。用 linspace + tile 做横向渐变。
import numpy as np, matplotlib.pyplot as plt x = np.linspace(0, 1, 200) grad = np.tile(x, (200, 1)) plt.imshow(grad, cmap="gray"); plt.show() - ⑤ 解释为什么 OpenCV 读取的图片直接用 plt.imshow 会发蓝。OpenCV 是 BGR,matplotlib 按 RGB 显示,顺序反了。
import cv2 img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 转成 RGB 再 imshow
▶️ 在线运行:阶段 8 · 图片显示流程(浏览器模拟)
阶段 9 ⭐⭐⭐数据可视化:Matplotlib 画图
画图能让数据"一眼看懂"。Matplotlib 是最常用绘图库:柱状图比大小、散点图看关系、子图拼一起。关键英文:plot=画线,bar=柱,scatter=散点,title/label=标题/标签,subplot=子图。
plt.figure(figsize=(宽,高))—— 新建一张画布并指定尺寸plt.bar(x, y)—— 画柱状图,x 是类别,y 是数值plt.scatter(x, y)—— 画散点图,看两个变量的关系plt.subplot(行, 列, 位置)—— 把画面分成网格,定位当前子图plt.title / xlabel / ylabel—— 设置标题和坐标轴名称
import matplotlib.pyplot as plt
import numpy as np
# 准备数据
names = ["小明", "小红", "小刚", "小美"]
scores = [88, 92, 75, 81]
# 1) 柱状图
plt.figure(figsize=(6,4))
plt.bar(names, scores, color="#0ea5e9") # bar=柱状
plt.title("成绩柱状图"); plt.ylabel("分数")
plt.show()
# 2) 散点图(身高 vs 体重)
h = [160, 170, 165, 175, 168]
w = [55, 68, 60, 72, 63]
plt.figure(figsize=(6,4))
plt.scatter(h, w, color="#ef4444") # scatter=散点
plt.title("身高-体重散点"); plt.xlabel("身高"); plt.ylabel("体重")
plt.show()
# 3) 子图:一行两列,左柱右散
fig, axes = plt.subplots(1, 2, figsize=(10,4))
axes[0].bar(names, scores, color="#0ea5e9"); axes[0].set_title("柱状")
axes[1].scatter(h, w, color="#ef4444"); axes[1].set_title("散点")
plt.tight_layout(); plt.show()
📖 逐行解释
- plt.bar 适合"分类对比"(谁高谁低一看便知)。
- plt.scatter 适合"两个变量是否相关"(点越斜越相关)。
- plt.subplots(1,2) 一行两列,axes[0]、axes[1] 分别操作左右两格。
- 每次 plt.show() 输出一张图;平台运行器会把图直接显示在下方。
- plt.plot 画折线,plt.bar 画柱子,plt.scatter 画散点。
- 画图前先铺纸
plt.figure(),分格子用plt.subplot(行, 列, 第几个)。 - 一定要写标题和轴标签:
plt.title()、plt.xlabel()、plt.ylabel()。 - show() 才会把图显示出来,只画图不 show 等于白画。
用 plt.plot 画一条"天数 1-5 对应学习时长 [1,2,3,5,8]"的折线,并加标题。
import matplotlib.pyplot as plt
days = [1,2,3,4,5]
hours = [1,2,3,5,8]
plt.plot(days, hours, marker="o", color="#16a34a")
plt.title("每日学习时长"); plt.xlabel("天数"); plt.ylabel("小时")
plt.show()plt.pie(数据, labels=标签)—— 画饼图展示占比。fig, axs = plt.subplots(2, 2)—— 排成 2 行 2 列的子图,用axs[行,列].plot(...)画。
- ① 用 matplotlib 画一条 y=x² 的曲线。arange 造 x,直接 x**2。
import numpy as np, matplotlib.pyplot as plt x = np.arange(0, 11) plt.plot(x, x**2); plt.show() - ② 给柱状图添加标题、x轴和y轴标签。用 title / xlabel / ylabel。
import matplotlib.pyplot as plt plt.bar(["A","B","C"],[3,7,5]) plt.title("标题"); plt.xlabel("x轴"); plt.ylabel("y轴") plt.show() - ③ 用不同颜色在同一张图里画出两条折线。plot 多次,用 label + legend。
import numpy as np, matplotlib.pyplot as plt x = np.arange(5) plt.plot(x, x, label="y=x") plt.plot(x, x**2, label="y=x²", color="red") plt.legend(); plt.show() - ④ 画一个饼图,展示 [30, 20, 50] 的占比,并加标题。plt.pie 配 labels。
import matplotlib.pyplot as plt plt.pie([30,20,50], labels=["甲","乙","丙"]) plt.title("占比"); plt.show() - ⑤ 用 subplot 把 4 张小图排成 2 行 2 列。subplots(2,2) 后逐格画。
import numpy as np, matplotlib.pyplot as plt x = np.arange(5) fig, axs = plt.subplots(2, 2) axs[0,0].plot(x, x) axs[0,1].bar([1,2,3],[3,2,1]) axs[1,0].pie([1,1]) axs[1,1].plot(x, x**2) plt.show()
▶️ 在线运行:阶段 9 · 数据可视化
🧩 综合闯关 · 阶段 1-9(数据 + 清洗 + 可视化)
生成一组模拟成绩,统计各分数段人数,并画出柱状图。
import numpy as np
import matplotlib.pyplot as plt
# 1. 生成 30 个 0-100 的随机整数
scores = np.random.randint(0, 101, size=30)
# 2. 分桶统计(优秀/及格/不及格)
high = mid = low = 0
for s in scores:
if s >= 90:
high += 1
elif s >= 60:
mid += 1
else:
low += 1
print("优秀:", high, "及格:", mid, "不及格:", low)
# 3. 画图
plt.figure(figsize=(6,4))
plt.bar(["优秀", "及格", "不及格"], [high, mid, low], color=["green", "orange", "red"])
plt.title("成绩分段统计")
plt.xlabel("分数段")
plt.ylabel("人数")
plt.show()
💡 考点:np.random.randint、循环计数、plt.bar、中文标题、show。
阶段 10 ⭐⭐⭐⭐综合挑战:遍历+分类+复制+保存(华必达第 6 关)
题目:把前面所有能力串起来——遍历文件夹、挑出图片、自动建目录、复制到输出文件夹并计数;进阶做视频抽帧。关键英文:makedirs=建目录,shutil=文件操作库,copy2=复制,VideoCapture=开视频,release=释放。
os.makedirs(路径, exist_ok=True)—— 递归创建多级目录;已存在也不报错shutil.copy2(源, 目标)—— 复制文件并尽量保留元信息(时间戳等)os.path.join(路径, 名)—— 跨平台安全地拼接路径cap = cv2.VideoCapture(路径)—— 打开视频文件准备逐帧读取ret, frame = cap.read()—— 读一帧;ret=False 表示读完了
import os
import shutil # shutil=高级文件操作(复制/移动)
# 造一个源文件夹和示例图片
os.makedirs("./src", exist_ok=True)
for name in ["a.jpg", "b.png", "c.txt", "d.jpg"]:
open(os.path.join("./src", name), "w", encoding="utf-8").close()
# 综合:遍历源文件夹 → 挑图片 → 自动建目录 → 复制 → 计数
def copy_images(src_folder, dst_folder):
os.makedirs(dst_folder, exist_ok=True) # makedirs=递归建目录
count = 0
for name in os.listdir(src_folder):
ext = os.path.splitext(name)[1].lower() # 取扩展名
if ext in {".jpg", ".png"}:
src = os.path.join(src_folder, name)
dst = os.path.join(dst_folder, name)
shutil.copy2(src, dst) # copy2=复制并保留元信息
count += 1
print(f"已复制 {count} 张图片到 {dst_folder}")
copy_images("./src", "./output/images")
print("输出目录:", os.listdir("./output/images"))
# ---- 进阶:视频抽帧(需本地装 OpenCV,浏览器无法运行)----
# import cv2
# cap = cv2.VideoCapture("./video.mp4") # 打开视频
# n = 0; saved = 0
# while True:
# ret, frame = cap.read() # 逐帧读取
# if not ret: break # 读完退出
# if n % 30 == 0: # 每 30 帧存一张
# cv2.imwrite(f"./output/frame_{saved:05d}.jpg", frame)
# saved += 1
# n += 1
# cap.release() # 释放资源
📖 逐行解释
- os.makedirs(..., exist_ok=True) 比 mkdir 强,能一次建好多级目录,且已存在不报错。
- shutil.copy2 复制文件还保留原信息;复制前必须保证目标目录已存在。
- os.path.join 用系统正确分隔符拼路径,Windows/Linux 都通用。
- 视频抽帧用 cap.read() 循环,读不到就 break,结束必须 cap.release() 释放。
- 综合题 = 把前面所有工具串起来:os 遍历、字典计数、shutil 复制、异常处理、循环。
- 先建目录再复制:
os.makedirs("目标目录", exist_ok=True)防止目录已存在时报错。 - 复制用 shutil.copy2,保留原文件信息;批量操作套在循环里。
- 视频/真实图片必须本地跑,浏览器里没有 OpenCV。
把上面 copy_images 改成:只复制 .png 图片,且把复制数量也返回(return count)。
import os, shutil
def copy_png(src_folder, dst_folder):
os.makedirs(dst_folder, exist_ok=True)
count = 0
for name in os.listdir(src_folder):
if os.path.splitext(name)[1].lower() == ".png":
shutil.copy2(os.path.join(src_folder, name),
os.path.join(dst_folder, name))
count += 1
return count
print("复制 png 数:", copy_png("./src", "./output/png"))- 写一个脚本:把 ./src 目录下所有 .jpg 复制到 ./out,并统计复制了多少张。
- 批量读取一个文件夹里的图片,统一 resize 到 128×128 后保存。
- 写一个函数:输入文件夹路径,返回该路径下各类文件的数量字典。
- 批量把 ./src 下所有 .png 复制到 ./png_out,.jpg 复制到 ./jpg_out,并分别计数。
- 写一个脚本:读取视频文件,每隔 10 帧保存一张图片到 output/ 目录。
▶️ 在线运行:阶段 10 · 综合挑战(文件复制)
🏆 终极综合闯关 · 阶段 0-10(全流程演练)
模拟 AI 训练师工作流:生成数据 → 清洗 → 统计 → 可视化 → 保存报告。
import os, json
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 1. 生成模拟数据
np.random.seed(0)
data = []
for i in range(20):
data.append({
"id": i + 1,
"city": np.random.choice(["深圳", "广州", "北京"]),
"score": np.random.randint(30, 101),
"passed": None # 待填充
})
# 2. 标记是否及格
for row in data:
if row["score"] >= 60:
row["passed"] = True
else:
row["passed"] = False
# 3. 转成 DataFrame 并清洗
df = pd.DataFrame(data)
print("原始行数:", len(df))
# 4. 分组统计
result = df.groupby("city")["score"].mean()
print("各城市平均分:")
print(result)
# 5. 保存结果
os.makedirs("output", exist_ok=True)
df.to_csv("output/report.csv", index=False)
with open("output/report.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print("报告已保存到 output/ 目录")
# 6. 可视化
plt.figure(figsize=(6,4))
plt.bar(result.index, result.values, color=["#0ea5e9", "#22c55e", "#f59e0b"])
plt.title("各城市平均成绩")
plt.xlabel("城市")
plt.ylabel("平均分")
plt.show()
💡 考点:字典/列表、for/if、NumPy 随机数、Pandas 分组、JSON/CSV 保存、matplotlib 画图、os.makedirs。
- 数据生成:字典列表,一个样本一行。
- 清洗/标记:for 遍历 + if 判断 + 改字段。
- 统计分析:pd.DataFrame + groupby。
- 保存报告:to_csv + json.dump。
- 出图汇报:plt.bar + title/label/show。
实操项目:图像处理(翻转 / 灰度)
这是「技能考核重点练习」里的核心实操:用 Python 函数 对数据(图片)进行处理。下面这个工具完全离线可用——上传一张图,点按钮看效果,旁边给出端到端讲解和它对应的Python/OpenCV 代码,帮你把「图像翻转、灰度调整」记牢。
🖼️ 在线图像处理工具(Canvas 实现,离线可用)
📖 端到端讲解(点按钮看对应代码)
👈 左边操作,这里会显示每一步「原理 + Python/OpenCV 等价代码」。
先看「水平翻转」和「转灰度」——这是考试最常考的两个图像预处理操作。
🔧 对应 Python 代码(用 OpenCV / NumPy)
import cv2
import numpy as np
img = cv2.imread("photo.jpg") # 读图 → NumPy数组
# 1) 水平翻转(左右镜像)
flip_h = cv2.flip(img, 1) # 1=水平, 0=垂直, -1=都翻
# 2) 灰度调整(彩色→灰阶)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 原理:Gray = 0.299·R + 0.587·G + 0.114·B
# 3) 提亮(每个像素加固定值,限幅0~255)
bright = np.clip(img.astype("int16") + 30, 0, 255).astype("uint8")
cv2.imwrite("gray.jpg", gray) # 保存结果
0.299/0.587/0.114 是「人眼对绿色最敏感」来的,选择题可能考。🏷️ 图片标注流程(考试重点)
数据标注 = 给原始数据「贴标签」,让 AI 知道什么是什么。图像标注常见流程:
- 矩形框标注:目标检测,用 LabelImg,生成 XML。
- 多边形/语义分割:用 LabelMe,生成 JSON。
- 标注规范:边界模糊标最内接矩形;目标被遮挡标可见部分;背景噪声要备注。
- 质量指标(IoU):预测框与真实框的「交并比」,越大越准。
🧪 用 NumPy 实现灰度(在线跑一遍)
🛠️ 实操考核详解(真实操作 + 代码联动)
五级实操不是「背理论」,而是要在 120 分钟里完成:采集→处理→清洗→标注→分类统计→系统运维→提交。下面 11 个项目覆盖 2024–2026 真题全部题型。下面每个操作点都配了工具截图步骤、可运行代码、合规检查清单。遇到代码直接点「▶ 运行」就能练。
📊 权重与分值速记(先背这个)
采集(网页/文件/数据库/CSV日志)+ 处理(遍历统计/关键词筛选/整理归类)
清洗(文/视/语)+ 标注(文/视/语)+ 分类统计 ← 重中之重
系统基础操作 + 维护(日志/反馈单)
🚀 0 基础 → 完全学会:实操学习路径
过「变量/列表/字典/条件/循环/字符串/函数」基础路径,每道题点 ▶ 运行看懂输出。
学「文件夹遍历 / NumPy / JSON / Pandas」,重点练
os.listdir、pd.read_csv、json.load。
跟做下面 11 个项目:从 CSV 读取 → 文件遍历 → 清洗标注 → 分类统计 → 目标检测 → 图像分类 → 问答机器人配置。
💡 学习原则:先抄代码 → 再改参数 → 最后遮住答案自己写。每个项目都配了可运行代码,零基础也能边抄边懂。
模块一:数据采集和处理(30分)
1.1.1 原始业务数据采集 · 网页抓取
- 打开工具 → 新建「智能模式」任务 → 粘贴目标网址。
- 等待工具自动识别列表/表格字段。
- 检查字段名,删除不需要的列,重命名中文列名。
- 设置采集页数 / 翻页规则(如「下一页」按钮)。
- 点击「开始采集」→ 导出为
Excel / CSV / JSON。
- 采集前确认是否涉及个人信息 / 版权,需做合规判断。
- 导出文件命名规范:
来源_日期_采集人.扩展名,如客服会话_20260815_张三.csv。 - 敏感字段先脱敏再保存(手机号 →
138****5678)。
1.1.1 代码联动:把抓取的 txt 会话转成 CSV
1.1.2 数据库内业务数据采集 · SQLite
- 打开数据库工具 → 连接 SQLite 文件(
.db/.sqlite)。 - 查看表结构,确认字段名和数据类型。
- 写单表查询:
SELECT 字段 FROM 表 WHERE 条件; - 执行查询 → 检查结果条数是否正确。
- 导出为
CSV或Excel,按任务单命名保存。
SELECT 姓名, 年龄 FROM 用户 WHERE 年龄 > 18;
SELECT COUNT(*) FROM 订单 WHERE 状态 = '已完成';
SELECT DISTINCT 城市 FROM 客户;
1.1.2 代码联动:Python 读 SQLite 并导出 CSV
1.2.1 业务数据整理归类 · Excel / Pandas
- 打开 Excel → 「数据」→「获取数据」导入 CSV/TXT。
- 检查编码:中文乱码时选
UTF-8或GBK。 - 去重:选中数据 → 「数据」→「删除重复值」。
- 处理缺失值:空单元格标记为「缺失」或删除整行。
- 格式统一:日期设为
yyyy-mm-dd,文本去空格。
| 需求 | Excel 操作 | Pandas 代码 |
|---|---|---|
| 去重 | 数据 → 删除重复值 | df.drop_duplicates() |
| 删空行 | 筛选 → 删除空白 | df.dropna() |
| 格式统一 | 设置单元格格式 | df['日期'] = pd.to_datetime(df['日期']) |
| 分类归档 | 按列排序/分组 | df.sort_values('类别') |
1.2.1 代码联动:整理归类示范
1.2.2 业务数据汇总 · 透视表
- 选中数据区域 → 「插入」→「数据透视表」。
- 把「类别/城市」拖到行,把「分数/金额」拖到值。
- 右键值字段 → 「值汇总方式」选求和/平均值/计数。
- 生成透视表后,复制结果到新的工作表,命名保存。
模块二:数据标注(60分 · 核心分值)
2.1.1 数据清洗 · 三类数据真实操作
- 用文本编辑器或 Python 去除 HTML 标签、特殊符号。
- 统一全半角、大小写。
- 删除重复句、空行、乱码。
- 保存为 UTF-8 编码的 txt/csv。
- 用图片浏览器批量查看,删除模糊/过曝/欠曝图。
- 删除重复图片(可用文件名/哈希比对)。
- 统一格式为 jpg/png,统一尺寸。
- 按类别建文件夹归档。
- 用音频播放器听检,标出静音段、噪声过大段。
- 删除破损音频(无法播放的文件)。
- 统一采样率(如 16kHz)和格式(wav/mp3)。
- 截取有效语音片段并编号。
2.1.2 数据标注 · 工具实操截图
- 打开 LabelImg → 「Open Dir」选择图片文件夹。
- 「Create RectBox」画矩形框 → 输入标签名(如
cat)。 - 按「Ctrl+S」保存为 XML/TXT。
- 下一张:「Ctrl+D」。
- 创建项目 → 选择「文本分类」或「序列标注」。
- 导入 txt/csv 数据。
- 按标签体系标注(情感:正面/负面/中性;NER:人名/地名/机构)。
- 导出 JSONL/CSV 标注结果。
2.1.2 代码联动:情感标注后分类统计
2.2.1 标注后数据分类
- 按标签类别建立文件夹:
正面/、负面/、中性/。 - 把对应数据文件/记录复制到对应文件夹。
- 检查错标、漏标,进行二次修正。
- 导出结果文件:
JSON / XML / CSV,命名规范:项目名_标注结果_日期.csv。
2.2.2 标注后数据统计
准确率 = 标注正确数 ÷ 抽检总数 × 100%(合格线常 ≥ 95%)
实操考试会要求填写「标注任务完成记录表」和「质量自检表」,包括:总样本数、各类别数量、完成率、准确率、标注人、日期。
模块三:智能系统运维(10分)
3.1 智能系统基础操作
- 启动系统,用指定账号登录。
- 按任务单调用 AI 功能:智能客服对话、分类工具、推理任务。
- 记录输入输出示例(截图或复制文本)。
- 检查系统默认参数,必要时还原默认值。
3.2 智能系统维护 · 填表模板
系统运行日志
日期:2026-08-15
功能:智能客服测试
调用次数:20
成功率:19/20 = 95%
异常:1 次超时(14:32)
处理人:张三
问题反馈单
问题描述:客服回复偏离主题
复现步骤:输入"退货"后选择"换货"
期望结果:进入换货流程
实际结果:仍提示填写退货原因
🛡️ 数据安全法合规专项(2026 权重上升)
- 合法正当:采集数据前需有明确目的,不得非法收集。
- 最小必要:只采集完成任务所必需的数据。
- 告知同意:涉及个人信息时,需告知用户并取得同意。
- 脱敏处理:手机号、身份证、地址等需遮蔽后再使用/标注。
- 分类分级:重要数据与核心数据实行更严格管理。
- 采集数据前,确认是否有授权或公开来源。
- 检查字段是否含手机号、身份证、人脸、地址。
- 敏感字段做脱敏:
13812345678 → 138****5678。 - 标注结果中不得保留原始敏感信息。
- 保存路径加密或设权限,防止泄露。
代码联动:自动手机号脱敏
📝 实操自测(点开看答案)
理论填空必背(来自真题讲解)
下面这些填空来自培训课件与考试截图中的高频考点。先遮住答案自己填,再点开对照。
🐍 Python 在线编程环境
这里是一个独立的浏览器 Python 运行器,基于 Pyodide(浏览器里的 Python)。你可以直接写代码、运行、看结果。已预装 NumPy、Pandas、Matplotlib。涉及本地文件/图片/OpenCV 的代码请在本地 VS Code 运行。
📌 使用提示
- 首次运行会从 CDN 加载 Python 环境,约 3–8 秒,请耐心等待。
- 支持
print()、NumPy、Pandas、Matplotlib 绘图(图会自动显示在结果下方)。 - 文件操作可用:运行器使用虚拟文件系统,你可以用
open()读写当前目录下的文件。 - 不支持 OpenCV / 视频处理,这类代码请复制到本地运行。
🎯 建议练习路线
- 先在本页熟悉 Python 语法和报错。
- 再到「四、真题精讲 → 实操代码演变(易→难)」,每关都有「在线运行」按钮,预装好了代码。
- 遇到困难先对照「必背语法 / 变量」和「统一写法演示」,再自己改代码跑。
🎴 函数闪卡背诵游戏
把重点函数做成可翻转的闪卡:正面看英文+中文意思,点一下翻到背面看格式 + 示例 + 记忆口诀。点「✅ 认识」会长期记住,点「❌ 不认识」下次还会再考。零基础也能玩,遇到英文点 🔊 听读音。
用法
🎉 这一轮刷完啦!
已认识 0 张
2024–2026 真题自测库
以下题目整理自五级(初级)人工智能训练师公开考试资料(理论知识复习题 + 操作技能复习题 / 模拟试卷),全部为五级考点。先自己想答案,再点开看正确答案和解析。建议每天刷 20 题,错题反复看。
📜 背诵速记版(一页背完)
这一版把要背的全浓缩在一页,适合随时打开快速背。内容从同一网址下的「背诵版」自动加载,不用再开新页面。
🧩 缩进小测验:这段代码缩进对吗?
Python 讲究「缩进 = 层级」。下面每段代码,请你判断:缩进用对了吗?点「✅ 正确 / ❌ 错误」看解析。反复练,考试不踩坑。
: 的下一行要缩进 4 个空格;同一层的代码要左对齐(顶格);缩进不一致会直接报错 IndentationError。🔤 字符串 / 文件 / 可视化 变式题
同一个知识点换不同场景反复练,才真会。每题都能直接点「▶ 运行」看结果。先自己写,再对照参考代码。
模拟考试
00:00🎯 阶段融合题 · 每天 3 道
按第一阶段、第二阶段、第三阶段划分,每阶段 15 道融合题。每道题都可在线运行,建议每天做 3 道,循环巩固,避免遗忘。当前显示的是第一阶段,点击标签切换。
题 1:样本信息格式化输出
用变量保存样本名、标签和分数,按格式输出报告。
题 2:列表索引取首尾
给定样本列表,取出第一个和最后一个样本名。
题 3:字典取值与判断
从样本字典中读取年龄和标签,并判断是否成年。
题 4:及格判定
给定考试分数,判断是否合格(≥60 分合格)。
题 5:统计各标签数量
遍历标签列表,统计 positive / negative / neutral 各有多少个。
题 6:CSV 行拆分字段
把一条逗号分隔的记录拆成姓名、年龄、标签三个字段。
题 7:封装准确率函数
写一个函数,传入正确数和总数,返回准确率百分比。
题 8:批量计算文本长度
用列表推导式,计算每条评论的字数。
题 9:带序号遍历文件
给文件列表加上序号打印,方便定位。
题 10:列表去重保序
去除样本列表中的重复项,同时保持原有顺序。
题 11:判断图片文件名
判断文件名是否为图片(.jpg / .png / .jpeg,忽略大小写)。
题 12:用字典做词频统计
统计一段文本中每个字出现的次数。
题 13:批量生成报告字符串
用 f-string 批量输出样本检查报告。
题 14:读取嵌套字典
从标注结果 JSON 结构中读取图片宽度和标注框坐标。
题 15:综合筛选样本
从样本列表中筛选出标签为 positive 且分数大于 0.8 的样本 ID。
📄 人工智能训练师(五级)真题试卷
八套真题资料整合:理论知识(单选 / 多选 / 判断)+ 实操技能(写入要求 · 例题 · 练习)。点「显示答案 / 看例题 / 看练习答案」即可在试卷内查看,无需翻页。
🏷️ 照片 / 精灵标注实操教程(五级 · 模块二 数据标注)
这部分专门讲图像类标注——也就是「给一张照片画框、标出目标」以及「精灵图(雪碧图)里每张小图的坐标怎么算」。它是五级实操 模块二 数据标注(占 60 分,最核心) 里视觉标注的落地代码。下面两段代码都能在「▶️ 在线运行」里直接跑,跟着抄一遍就会了。
📸 照片 1:给一张动物照片画矩形框 + 导出标准标注
下面模拟「保护动物」试题里的一张照片(photo1.jpg,800×600),标注员框出了一只动物,我们把它写成 LabelMe 标注工具通用的 JSON 格式(真实考试里你用 LabelMe 鼠标画框,本质就是算这几个坐标)。
🧚 精灵标注(Sprite Sheet):一张大图里每张小图的坐标怎么算
「精灵图 / 雪碧图(sprite sheet)」是把很多小图标排进一张大图。做标注或做游戏素材时,要算出每个小精灵在大图里的位置框。下面按「网格」自动算出来:
📋 实操标注标准作业流程(照着做就不会丢分)
- 采集:拿到照片/视频帧,确认场景与标注目标符合业务需求。
- 定规范:先写「标签定义 + 标注示例 + 边界规则」(如:边界模糊标最内接矩形)。
- 画框/描边:用工具标出目标,紧贴目标边缘、被遮挡只标可见部分。
- 质检:多人交叉抽检,计算标注准确率(合格线通常 ≥ 95%)与一致性。
- 导出提交:按格式导出 JSON / XML / CSV,并填写完成记录表与质量自检表。
📺 五级初级免费视频资源汇总(仅收录公开可访问内容)
下面这些资源都是公开、免费、能直接打开看的,适合配合本站的「先教后考」路线使用。按「官方 > 公开课 > 科普 > 线下公益班」的优先级看,效率最高。
平台:人力资源社会保障部 职业技能等级认定平台
地址:jc.mohrss.gov.cn/lesson/834
费用:免费 等级:五级/初级
特点:官方出品,理论+实践命题,0 基础友好,考什么就讲什么。
首选权威免费
地址:BV1oxXrYDEfh
时长:约 11 小时 37 分
覆盖:岗位认知 → 标注工具安装(LabelImg) → 智能客服微调 → 训练项目全流程。
免费实操多适合0基础
· 一次看懂人工智能 BV1134y1d72L
· 商汤 AI 101 BV1EE411W7V3
· 纪录片《你好,AI》
用途:搞清「机器学习/深度学习/标注」到底是什么,看课不犯困。
免费打基础
搜索关键词:「人工智能训练师 国家职业技能标准 2021」。
这是出题的根本依据:五级考数据采集/清洗/标注/运维,权重 30/25/60/10(操作)+ 理论对应模块。
必读考纲来源
绵阳 / 珠海 / 武汉 / 长沙等地人社部门常推「免费 AI 训练师培训班」,学完可自费考五级证、领补贴。
关注当地「人社」「职训中心」公众号获取期次。
免费可考证线下实操
本平台的「融合学习路径 + 实操考核详解 + 真题库 + Python 在线运行器」就是按五级考纲搭的,配合上面视频看,效率翻倍。
随时练可运行
📚 实操项目详细指导教程(五级 · 模块一/二/三 全程演练)
五级实操 = 采集(30%) + 标注(60%) + 运维(10%)。下面用 7 个代表性项目,按「目标 → 工具 → 操作步骤 → 写代码 → 常见坑 → 评分点」完整走一遍。下面带 ▶ 的运行器都能直接跑,跟着抄一遍就会了。
🛠️ 各项目所需软件 & 📺 视频指引
| 项目 | 需要什么软件 / 工具 | 免费视频在哪学(专门讲本节) |
|---|---|---|
| 项目1 客服会话采集 | 记事本 / VS Code 看原始格式 + pandas(不会写代码也可只用 Excel 分列) | 📺 B站 BV1oxXrYDEfh(约 11.5 小时,含标注工具安装、智能客服微调、训练全流程) 📚 更多见 📺 免费视频资源汇总 板块 |
| 项目2 SQLite 采集 | SQLite / Navicat / DB Browser for SQLite | |
| 项目3 情感清洗标注 | Excel / WPS + doccano(文本标注) | |
| 项目4 分类统计 | Excel 透视表 / pandas groupby | |
| 项目5 数据脱敏 | Python + pandas(re 正则脱敏) | |
| 项目6 目标检测标注 | 精英标注助手 / LabelImg(画矩形框,导出 XML) | 📺 同上 BV1oxXrYDEfh(「标注工具安装」段) 另可搜「LabelImg 使用教程」「精灵标注助手 目标检测」 |
| 项目7 图像分类标注 | 精英标注助手 / LabelImg / LabelStudio(打类别标签,导出 XML) | |
| 项目8 CSV 日志读取 | VS Code + Python / Excel(预览 CSV) | 📺 统一见 BV1oxXrYDEfh 另可搜「pandas read_csv」「os.listdir 遍历文件」「shutil.copy 自动归类」「json.load 配置机器人」 |
| 项目9 文件遍历筛选 | VS Code + Python(os.listdir / glob) | |
| 项目10 按文件名归类 | VS Code + Python(os / shutil) | |
| 项目11 机器人配置 | VS Code + Python(json 读写) |
说明:① 上述软件均为公开免费,考试机房一般会预装;② 视频只引用公开免费资源,不含任何需登录付费课程(如 atacollege);③ 下面每个工具都配了「软件界面示意图」(非真实截图,仅为界面布局参考),对照操作即可学会;想换成真实截图,把你的软件界面图替换进去仍是图文教程。
🗂️ 项目一:客服会话数据采集(txt → CSV)
目标:把客服聊天记录整理成结构化表格,方便后续标注与分析。
工具:记事本/VS Code 看原始格式 + pandas 处理(不会写代码也能用 Excel 分列做)。
步骤:① 看清原始格式(每行「时间|方向|内容」)② 用 pandas 读、过滤脏数据、导出。
sep="|" 不是逗号);② 不写 encoding="utf-8-sig" 导致 Excel 打开中文乱码;③ 脏数据(缺字段行)没过滤,导出的 CSV 列数对不上。评分点:字段完整、无空行、列名规范、中文不乱码。
🗄️ 项目二:SQLite 数据库采集
目标:从业务数据库里 SELECT 需要的字段,导出成 CSV。
工具:DB Browser for SQLite / Navicat(图形界面直接导),或下面用代码做。
步骤:① 连接库 ② 写 SELECT(带 WHERE 过滤 NULL/日期)③ pandas 读结果导出。
message IS NULL 的行没过滤;② 忘记 conn.close() 锁表;③ 日期筛选条件写错。图形界面做法:打开 .db → 执行 SQL → 「导出 CSV」同样能得分。评分点:只导出有效字段、NULL 已剔除、列名准确。
😊 项目三:情感识别·数据清洗与标注
目标:给文本打「正面/负面/中性」标签,并先把脏数据清干净。
工具:Excel / doccano(文本标注工具)。
步骤:① 去缺失 ② 去首尾空格 ③ 去重 ④ 按关键词打标 ⑤ 统计分布。
评分点:清洗步骤完整、标签一致、有分布统计。
📊 项目四:标注后分类统计(Excel 透视表 / pandas)
目标:统计各类标签的数量与占比,给业务方看。
工具:Excel 透视表(拖拽即可)或 pandas groupby / value_counts。
步骤(Excel):选中数据 → 插入 → 透视表 → 行放「标签」、值放「计数」。下面用代码复刻同样结果:
import pandas as pd
df = pd.read_csv("标注结果.csv")
print(df["标签"].value_counts()) # 各类数量
print((df["标签"].value_counts(normalize=True)*100).round(1)) # 占比%
print(df.groupby("标签").agg(数量=("编号","count"), 平均分=("分数","mean")).round(1))
评分点:数量、占比都算对,并写出结论。
🔒 项目五:数据脱敏(合规专项 · 贴合今年上升权重)
目标:对手机号、身份证、姓名做基础脱敏,符合《个人信息保护法》《数据安全法》。
工具:Excel 替换 / 用下面正则表达式批量处理。
步骤:① 识别敏感字段 ② 用规则保留部分字符、其余打星 ③ 输出脱敏后数据,原数据不落地。
评分点:脱敏规则正确、可还原必要信息、说明合规依据。
🖼️ 项目6 · 目标检测标注:日常用品(bottle)
对应真题「原始数据清洗与标注」第一小题:用标注工具对 \items\ 路径下的图片做目标检测,标签为 bottle,导出 XML 格式。
- 打开标注工具 → 点击「新建项目」。
- 项目类型选「目标检测 / 矩形框标注」。
- 填写项目名称(如
日常用品标注),图片文件夹选\items\。 - 在「标签列表」里添加标签:
bottle。 - 对每张瓶子的图片,按住鼠标左键拖动画出矩形框,框要紧贴瓶身边缘。
- 选中框后输入/选择标签
bottle,按Ctrl+S保存。 - 点击「导出」→ 格式选 XML → 保存到
\items\文件夹(与图片同名,扩展名 .xml)。
<annotation>
<folder>items</folder>
<filename>bottle_001.jpg</filename>
<size>
<width>800</width><height>600<height><depth>3</depth>
</size>
<object>
<name>bottle</name>
<bndbox>
<xmin>350</xmin><ymin>120</ymin>
<xmax>470</xmax><ymax>520</ymax>
</bndbox>
</object>
</annotation>
<filename>:对应原图文件名。<name>:标签名,本题固定为bottle。<bndbox>:矩形框左上角(xmin,ymin)和右下角(xmax,ymax)。
项目6 · 代码联动:生成一张 bottle 标注的 XML
Bottle(大小写要一致);② 坐标超出图片范围;③ 保存路径不是 \items\;④ 用成「图像分类」模式而不是「目标检测」模式。评分点:矩形框紧贴目标、标签正确、XML 与图片同名同路径。
🦒 项目7 · 图像分类标注:动物(giraffe / zebra)
对应真题第二小题:用标注工具对 \zoo_classify\ 路径下的图片做图像分类,类别为 giraffe(长颈鹿)和 zebra(斑马),导出 XML 到 \zoo_classify\labels\。
- 打开标注工具 → 点击「新建项目」。
- 项目类型选「图像分类」(不是目标检测)。
- 填写项目名称(如
动物图像分类),图片文件夹选\zoo_classify\。 - 在「类别列表」里添加两个标签:
giraffe、zebra。 - 逐张查看图片:长颈鹿图选
giraffe,斑马图选zebra,点击「确认 / 下一页」。 - 全部标注完成后,点击「导出」→ 格式选 XML → 保存到
\zoo_classify\labels\。
<annotation>
<folder>zoo_classify</folder>
<filename>giraffe_003.jpg</filename>
<size>
<width>1024</width><height>768</height><depth>3</depth>
</size>
<object>
<name>giraffe</name>
</object>
</annotation>
- 图像分类不画框,只对整张图片打一个类别标签。
- 导出文件夹必须叫
labels,与图片文件夹zoo_classify同级。 - 有些工具会导出成
image_name.xml,每文件一个类别。
项目7 · 代码联动:批量生成分类标注 XML
giraff/zebra 大小写);③ XML 没保存到 labels 子文件夹;④ 一张图同时标了两个类别(除非题目要求多标签)。评分点:类别正确、文件命名/路径规范、XML 格式完整。
🗂️ 项目8 · 业务数据采集:结构化 CSV 用户行为日志
对应真题「一、业务数据采集」:电商/平台用户行为日志通常存为 user_log.csv,要求用 Python 读取前 10 行并输出总行数。
- 把素材
user_log.csv复制到C:\Project\1\(或题目指定路径)。 - 用 Excel 预览:确认表头、分隔符是逗号还是空格、是否有中文乱码。
- 在 VS Code 新建
answer_01.py,写入 pandas 读取代码。 - 运行后截图:前 10 行 + 总行数。
- 把
.py文件和运行结果截图保存到答案回收路径。
import pandas as pd
df = pd.read_csv('user_log.csv', encoding='utf-8')
print(df.head(10)) # 前10行
print(len(df)) # 总行数
print(df.shape) # (行数, 列数)
编码不对时试 encoding='gbk';分隔符是空格时用 sep=' '。
项目8 · 代码联动:生成模拟日志并读取
常见坑:忘记
encoding='utf-8' 导致中文乱码;把 head(10) 写成 head()(默认 5 行)。📁 项目9 · 业务数据处理:文件遍历与关键词筛选
对应真题「二、业务数据处理」两小题:① 遍历 server_logs\ 统计 .txt 日志文件数量;② 遍历 dataset\animals\ 筛选文件名含 tiger / lion 的图片。
- 用
os.listdir(path)列出文件夹里所有文件名。 - 用
os.path.isfile()过滤掉子文件夹。 - 用
.endswith('.txt')或'.txt' in name统计文本文件。 - 用
if 'tiger' in name or 'lion' in name:筛选关键词。 - 把结果打印/写入答案文件。
import os
files = os.listdir('server_logs')
txt_files = [f for f in files if f.endswith('.txt')]
print('txt数量:', len(txt_files))
animals = os.listdir('dataset\\animals')
keys = [a for a in animals
if 'tiger' in a or 'lion' in a]
print(keys)
项目9 · 代码联动:文件遍历 + 关键词筛选
常见坑:Windows 路径用
\\ 或 /;大小写不敏感时加 .lower();别把子文件夹也算进文件。🏃 项目10 · 标注后数据分类:按文件名自动归类图片
对应真题「四、标注后数据分类与统计」:把 sports_images\ 文件夹里以 tennis_ / swimming_ / cycling_ 开头的图片,自动复制/移动到对应的类别文件夹。
- 打开
sports_images文件夹,观察文件名前缀规律。 - 手动:新建
tennis/、swimming/、cycling/三个文件夹,按前缀拖文件进去。 - 或写 Python 脚本自动归类(推荐,考试更稳)。
- 检查每个子文件夹里的图片数量和文件名。
- 截图保存归类结果。
import os, shutil
prefixes = ['tennis_','swimming_','cycling_']
for pre in prefixes:
os.makedirs(pre, exist_ok=True)
for name in os.listdir('sports_images'):
for pre in prefixes:
if name.startswith(pre):
shutil.copy(...)
项目10 · 代码联动:按文件名前缀自动归类
常见坑:用
copy 还是 move 要看题目要求;前缀含下划线 tennis_ 不要漏写;不要把无关文件归进去。🤖 项目11 · 智能系统运维:政务问答机器人配置
对应真题「五、智能系统运维」:修改/补充 gov_robot_config.json 里的问答对,让机器人能正确回答政务大厅常见问题(如「办理身份证需要什么材料」「多久能领取」)。
- 找到
gov_robot_config.json,用 VS Code 打开。 - 观察 JSON 结构:通常有
qa_pairs数组,每个元素含question和answer。 - 按任务单要求新增/修改问答对(注意 JSON 语法:双引号、逗号、缩进)。
- 保存后运行测试脚本,输入问题看机器人回答是否正确。
- 把修改后的 JSON 和运行截图保存到
C:\Project\5\。
{
"qa_pairs": [
{"question":"办理身份证需要什么材料?",
"answer":"请携带身份证和户口簿..."},
{"question":"身份证到期了怎么换?",
"answer":"请携带...到政务大厅..."}
]
}
项目11 · 代码联动:加载配置并模拟问答
常见坑:JSON 里用了单引号;最后一个元素后面多加了逗号;中文标点写成英文标点导致匹配失败。
🛠️ 标注 & 数据清洗 软件实操细节教程
这一节专门讲软件怎么用——把「标注」和「数据清洗」两个五级实操重点,按真实软件菜单路径一步步拆开。每步都配软件界面示意图(对照着点菜单就能学会;想换成真实截图也行)。想看视频演示,直接跳到本节末尾「📺 B站看什么」。
一、数据清洗软件细节(Excel / WPS + pandas)
1.1 Excel / WPS 清洗(不会写代码也能做)
- 鼠标拖动选中整个数据区域(含表头)。
- 顶部菜单点「数据」→「删除重复值」。
- 在弹窗里勾选用于判断重复的列(一般全选),点「确定」。
- 提示「删除了 N 个重复项」即成功。
- 选中要拆的那一列。
- 「数据」→「分列」→ 选「分隔符号」→ 下一步。
- 勾选分隔符(如「其他」填
|或逗号)→ 下一步 → 完成。
- 点数据任意单元格 →「插入」→「透视表」。
- 把「类别」拖到行、把「数量」拖到值,即得到分类汇总。
1.2 pandas 清洗(代码联动,考场上更稳)
utf-8-sig);② 把"缺失"误当成"0";③ 去重前没先想清楚"哪些列相同才算重复",误删有效数据。二、标注软件细节(目标检测 / 图像分类 / 文本情感)
2.1 LabelImg(目标检测 · 矩形框 → XML)
pip install labelimg
使用步骤
- 命令行输入
labelImg打开软件。 - 点「Open Dir」选择图片文件夹(如
\items\)。 - 先点「Create RectBox」,按住左键拖出矩形框,紧贴目标边缘。
- 在弹出的框输入标签名(如
bottle)。 - 按
Ctrl+S保存为 Pascal VOC XML(与图片同名)。 - 按
Ctrl+D切下一张,循环。
- 新建项目 → 选「目标检测」或「图像分类」。
- 填项目名、选图片文件夹,添加标签/类别(如
giraffe/zebra/bottle)。 - 目标检测:拖框 + 选标签;图像分类:整图选类别。
- 导出 XML → 目标检测同路径、分类导到
labels子文件夹。
2.2 doccano(文本情感标注)
- 打开 doccano → 创建项目 → 选「文本分类」。
- 「导入数据集」上传 txt/csv(每行一句话)。
- 在「标签」里添加
正面/负面/中性。 - 逐条选中文本 → 点对应标签 → 保存。
- 导出 JSONL / CSV 标注结果。
2.3 Excel / WPS 做情感标注(最省事)
- 把评论放进 A 列。
- 在 B 列手动填
正面/负面/中性。 - 用「数据 → 透视表」按情感统计数量。
- 保存为
情感标注_日期.xlsx。
bottle 不要有时写 Bottle);框要贴边、被遮挡只标可见部分;导出格式/路径严格按任务单(XML / \items\ / \labels\)。📺 三、B站看什么(按需求对号入座)
| 你想解决的需求 | 看什么 |
|---|---|
| 标注工具安装 + 目标检测全流程 | 📺 B站 BV1oxXrYDEfh(约11.5h,含 LabelImg 安装、智能客服、训练全流程) |
| LabelImg 画框怎么用 | 搜「LabelImg 使用教程 / 目标检测标注」→ 看 5–15 分钟实操短片 |
| 精英标注助手 / 精灵标注 | 搜「精灵标注助手 目标检测」「精英标注助手 图像分类」 |
| Excel 数据清洗(分列/透视表) | 搜「Excel 数据清洗 分列 删除重复值 透视表」 |
| pandas 清洗/标注联动 | 搜「pandas 数据清洗 入门」「pandas drop_duplicates to_datetime」 |
| doccano 文本情感标注 | 搜「doccano 文本标注 教程」 |
| 更多免费资源合集 | 点 📺 免费视频资源汇总 板块 |