Python程序无法生成CSV文件:writerows()函数报错求助
解决CSV写入报错及图像像素导出问题
错误原因分析
writerows()方法误用:该方法要求传入多行数据的可迭代对象(如列表嵌套列表),但你传入的results是单个像素的行列表[x,y,r,g,b]。程序会尝试迭代列表里的每个整数,把它们当成独立行,因此触发_csv.Error: iterable expected, not int报错。- 文件操作位置错误:将
open()放在双层循环内,每次循环都会以w模式清空文件重写,最终CSV只会保留最后一个像素的数据,且表头会被重复写入。 - 图像尺寸获取错误:
Image.size返回(宽度, 高度),你把width和height都设为image.size[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() # 定义CSV表头 headers = ['x', 'y', 'r', 'g', 'b'] # 仅打开一次文件,避免重复覆盖 with open('seed45-3-4.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f, delimiter=';') # 写入表头(仅执行一次) writer.writerow(headers) # 遍历所有像素并写入数据 for x in range(height): for y in range(width): r, g, b = pix[x, y] # 用writerow()写入单行像素数据 writer.writerow([x, y, r, g, b])
额外优化说明
如果图像像素量很大,可先将所有像素数据收集到一个列表中,再用writerows()一次性写入,减少IO操作次数:
# 示例:先收集所有数据再写入 all_data = [headers] for x in range(height): for y in range(width): r, g, b = pix[x, y] all_data.append([x, y, r, g, b]) with open('seed45-3-4.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f, delimiter=';') writer.writerows(all_data)
内容的提问来源于stack exchange,提问作者Станислав Ведмедев
相关产品推荐
相关产品推荐

