Blender中用for循环写CSV多列仅记录首个顶点UV的问题排查
问题原因及修正方案
核心错误:文件打开位置错误
你把with open(...)放在了顶点循环for vert in bm.verts:内部,每次循环到新顶点时,用mode='w'打开文件会清空之前的所有内容。这意味着每处理一个顶点,之前写入的数据都会被覆盖,最终文件里只会保留最后一个顶点的UV数据(你说只看到第一个,可能是模型后续顶点没有关联的loop,或者循环提前中断了,但核心逻辑错误是文件操作嵌套层级不对)。
另外你的代码里不存在三层循环,只有两层:顶点循环 + 顶点关联的loop循环,问题出在文件操作的嵌套位置,而非循环层数。
修正后的代码
import csv import os import bmesh import bpy # ... 你的其他代码(比如获取bm、uv_lay的逻辑) # 把文件打开移到顶点循环外面,只打开一次 with open(full_file_path, mode='w', newline='') as file: writer = csv.writer(file) # 可选:写入表头,方便识别列含义 writer.writerow(["顶点索引", "U坐标", "V坐标"]) # 遍历每个顶点 for vert in bm.verts: # 遍历该顶点关联的所有loop(一个顶点可能在多个面中,对应多组UV) for loop in vert.link_loops: uv_coords = loop[uv_lay].uv vert_ind = vert.index u = uv_coords[0] v = uv_coords[1] # 写入单条数据,用writerow比writerows更适配单场景 writer.writerow([vert_ind, u, v])
关键说明
- 文件仅打开一次,避免了每次循环清空文件的问题,所有顶点的UV数据都会持续写入到同一个文件中。
- 用
writerow()替代writerows(),因为每次只生成一行数据,写法更直观简洁。
内容的提问来源于stack exchange,提问作者Troy Carpenter




