Python图像像素写入CSV失败:append报错问题排查及修复建议
种子图像颜色特征采集程序Bug排查与修复
直接报错原因
你遇到的TypeError是因为列表的append()方法仅能接受单个参数,但你传入了5个独立值(x、y、r、g、b)。正确的做法是把这5个值打包成元组或列表再传入。
其他隐藏问题与修复建议
除了上述直接错误,代码还有多个致命问题,逐一修复如下:
宽高维度赋值错误
Image.size返回的是(宽度, 高度)的元组,原代码里把宽高都设为image.size[1],会导致遍历维度错误,修正为:width = image.size[0] # 正确获取宽度 height = image.size[1] # 正确获取高度循环内重复初始化与文件覆盖
原代码在双层循环内每次都创建空列表results,并且用"w"模式打开文件(会清空原有内容),最终只会保留最后一个像素的数据。需要把文件操作和列表初始化移到循环外:- 若选择边遍历边写入,打开文件时用
"a"追加模式(但更推荐先收集数据再一次性写入) - 若选择批量写入,先在循环内收集所有像素数据,最后统一写入文件
- 若选择边遍历边写入,打开文件时用
CSV Writer初始化错误
原代码错误地将表头headers传给csv.writer(),csv.writer()的参数应该是文件对象。同时冗余创建了DictWriter却未使用,可根据需求选择两种写入方式:- 用
csv.writer写入列表/元组数据 - 用
csv.DictWriter写入字典格式数据(需对应表头)
- 用
冗余库导入清理
代码中导入的cv2和os未被使用,可直接删除,减少不必要的依赖。
修复后的完整代码
方式1:批量收集数据后一次性写入(推荐,效率更高)
import csv from PIL import Image # 打开图像并获取参数 image = Image.open("S45-3-4.jpg") width = image.size[0] height = image.size[1] pix = image.load() # 初始化数据列表 results = [] # 遍历所有像素 for x in range(height): for y in range(width): r, g, b = pix[x, y] # 将像素数据打包成元组加入列表 results.append((x, y, r, g, b)) # 写入CSV文件 headers = ['x', 'y', 'r', 'g', 'b'] with open('result.csv', "w", newline='', encoding='utf-8') as file: writer = csv.writer(file, delimiter=',') # 写入表头 writer.writerow(headers) # 写入所有像素数据 writer.writerows(results)
方式2:边遍历边写入(适合超大型图像,节省内存)
import csv from PIL import Image # 打开图像并获取参数 image = Image.open("S45-3-4.jpg") width = image.size[0] height = image.size[1] pix = image.load() headers = ['x', 'y', 'r', 'g', 'b'] # 以写入模式打开文件,先写入表头 with open('result.csv', "w", newline='', encoding='utf-8') as file: writer = csv.writer(file, delimiter=',') writer.writerow(headers) # 遍历像素并逐行写入 for x in range(height): for y in range(width): r, g, b = pix[x, y] writer.writerow((x, y, r, g, b))
内容的提问来源于stack exchange,提问作者Станислав Ведмедев
相关产品推荐
相关产品推荐

