当前位置:首页>python>Python批量处理晶圆测试数据,零基础也能学会

Python批量处理晶圆测试数据,零基础也能学会

  • 2026-09-10 14:56:00
Python批量处理晶圆测试数据,零基础也能学会

Python批量处理晶圆测试数据,零基础也能学会

周五下午四点,产线送来本周80片晶圆的测试数据。你要做bin map分布、良率趋势、失效模式归类,还要在周一早会前给老板出报告。打开Excel那一刻,你就知道今晚又要加班——80个文件,手动打开、复制、整理、作图,一套流程下来至少三四个小时。

在半导体厂干了10年PE,我太熟悉这个场景了。后来我用Python写了个不到100行的脚本,处理这80片晶圆数据只要2分钟。今天把方法拆开讲,你完全不需要会编程。

解决方案概览

核心思路:用Python的pandas库读取所有CSV/测试文件,自动合并计算bin良率、生成bin map和趋势图,一键导出Excel报告。你只需要装一次环境,之后每个礼拜都是复制粘贴。

分步实操

第一步:安装Python环境(5分钟)

去 python.org[1] 下载Python 3.11+,安装时一定要勾选"Add Python to PATH"。装完后打开命令行,依次运行:

pip install pandas openpyxl matplotlib numpy

看到 "Successfully installed" 就说明环境装好了。这一步只有第一次要做。

第二步:整理你的数据文件

把所有晶圆测试数据放在同一个文件夹里,比如 D:\wafer_data。不管是CSV、TXT还是Excel导出的表格,只要每个文件里都有这几列就行:WaferID(片号)、Bin(测试bin号)、Die_X(芯片X坐标)、Die_Y(芯片Y坐标)。

不同厂商设备导出的文件格式五花八门,这一步的关键是:先打开一个原始文件,看看列名长什么样,记下来,后面脚本里要用。

第三步:写主脚本(复制即可用)

新建一个文本文件,粘贴以下代码,另存为 wafer_analysis.py:

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport globimport os# ===== 配置区:改成你自己的路径和列名 =====DATA_DIR = r"D:\wafer_data"# 数据文件夹OUTPUT = r"D:\wafer_data\报告"# 输出文件夹COL_MAP = {"wafer": "WaferID",       # 实际列名 -> 标准列名"x": "Die_X","y": "Die_Y","bin": "Bin"}# =======================================os.makedirs(OUTPUT, exist_ok=True)# 1. 读取所有文件并合并files = glob.glob(os.path.join(DATA_DIR, "*.csv"))dfs = []for f in files:    df = pd.read_csv(f)    df = df.rename(columns=COL_MAP)    dfs.append(df)all_data = pd.concat(dfs, ignore_index=True)# 2. 计算每片晶圆的bin分布和良率bin_stats = all_data.groupby(["WaferID", "Bin"]).size().unstack(fill_value=0)bin_stats["总芯数"] = bin_stats.sum(axis=1)bin_stats["良率"] = bin_stats.get(1, 0) / bin_stats["总芯数"] * 100# 3. 生成趋势图:每片晶圆良率折线plt.figure(figsize=(10, 5))plt.plot(bin_stats["良率"], marker="o")plt.title("Wafer Yield Trend")plt.xlabel("Wafer ID")plt.ylabel("Yield (%)")plt.grid(True)plt.savefig(os.path.join(OUTPUT, "yield_trend.png"), dpi=150)# 4. 生成bin map图(取第一片晶圆示例)sample_wafer = all_data[all_data["WaferID"] == all_data["WaferID"].iloc[0]]plt.figure(figsize=(6, 6))scatter = plt.scatter(sample_wafer["Die_X"], sample_wafer["Die_Y"],                      c=sample_wafer["Bin"], cmap="tab20", s=10)plt.colorbar(scatter, label="Bin")plt.title(f"Bin Map - {sample_wafer['WaferID'].iloc[0]}")plt.savefig(os.path.join(OUTPUT, "bin_map.png"), dpi=150)# 5. 导出Excel报告with pd.ExcelWriter(os.path.join(OUTPUT, "wafer_report.xlsx")) as writer:    bin_stats.to_excel(writer, sheet_name="Bin分布")    all_data.pivot_table(index="Bin", values="Die_X",                         aggfunc="count").to_excel(writer, sheet_name="Bin汇总")print("完成!共处理", len(files), "片晶圆")print("报告已保存到:", OUTPUT)

第四步:运行脚本

在命令行里执行:

cd D:\wafer_datapython wafer_analysis.py

跑完你会得到三样东西:

  • wafer_report.xlsx:所有晶圆的bin分布和良率总表
  • yield_trend.png:本周良率趋势图
  • bin_map.png:bin空间分布图

两分钟,完事。 剩下时间你可以去复核异常片,而不是在Excel里点复制粘贴。

关键参数说明

参数
说明
建议
COL_MAP
把原始文件列名映射为标准列名
必须改成你实际数据的列名,这是最容易错的一步
get(1, 0)
取bin=1的芯片数算良率
如果你们良品bin不是1,改成对应的bin号
glob("*.csv")
匹配所有CSV文件
有TXT或xlsx文件就改后缀,或再加一行*.txt
编码
中文CSV可能报解码错误
在pd.read_csv(f)里加encoding="gbk"试一下

常见问题和避坑提醒

1. 列名对不上,脚本报KeyError

这是90%的初学者会碰到的问题。Excel导入的CSV经常有\ufeff(BOM头)或前后空格,列名看起来一样但对不上。排查方法:先跑一行print(pd.read_csv("你的文件").columns),把打印出来的列名原样复制到COL_MAP里。不要手打,容易出全角空格这种隐形错误。

2. 良率算错:忘了bin=0可能是"未测试"

很多厂的数据里,bin=0表示划片道或未测试,不是失效。直接把所有非bin1都当不良,良率会虚低。正确做法:先print(all_data["Bin"].value_counts())看一眼bin的分布,确认哪些bin代表有效失效,再决定计算公式。

3. 一次性读几百个文件,内存爆了

80片没问题,但如果你手上有几千片的历史数据,pd.concat会占大量内存。正确做法:读文件时只保留需要的列,pd.read_csv(f, usecols=["WaferID", "Die_X", "Die_Y", "Bin"]),或者分批处理、只保留统计结果。

4. 把测试数据用文件名里的版本号混淆了

同款产品可能有多个工程版本,文件名里带V1、V2,直接全读进来会把不同版本混在一起。正确做法:在读取时用文件名生成一列,df["版本"] = os.path.basename(f),后面按版本分组分析。

5. 复制代码时缩进错了

Python对缩进极其敏感,代码块里每一行的空格数不能变。正确做法:不要手动重新排版,直接整体复制;如果报IndentationError,检查第20-25行的循环体缩进是否一致(都是4个空格)。

总结

这套脚本的核心价值,是把每周重复的"读文件—算良率—画图—做表"从3小时压缩到2分钟,而且不会有手动抄错的数字。你不需要成为程序员,只要会改三处配置(路径、列名、bin定义),就能跑起来。

更重要的是,这个思路可以扩展到任何重复性数据处理:CPK计算、SPC汇总、批次对比——底层都是"读取→合并→统计→出图"这四步。学会一次,受用终身。



本文为半导体工程师AI/自动化提效系列第6篇,关注公众号获取更多测试数据处理、报告自动化的实用教程。

引用链接

[1]python.org: https://www.python.org/downloads/

最新文章

随机文章