使用np.savetxt给CSV文件添加单个表头时重复出现的问题解决
解决CSV文件表头重复添加的问题
我看到你遇到的问题了——每次用np.savetxt循环写入CSV文件时,表头被重复添加到了每一行,这确实很头疼!问题的根源在于你每次循环都调用了带header参数的np.savetxt,并且以追加模式打开文件,导致每一行数据前都被插入了表头内容。
下面提供两种实用的解决方案,你可以根据数据量大小选择:
方案1:分两次写入(适合大数据量)
先判断文件是否存在,只在文件首次创建时写入表头,之后循环只写入图片数据,避免重复添加表头。
import os import cv2 import numpy as np IMG_DIR = 'path to the images' csv_path = 'Data.csv' # 第一步:仅在文件不存在时写入表头 if not os.path.exists(csv_path): # 获取一张示例图片,计算总像素数来生成对应表头 sample_img = cv2.imread(os.path.join(IMG_DIR, os.listdir(IMG_DIR)[0]), cv2.IMREAD_COLOR) total_pixels = sample_img.flatten().shape[0] # 生成类似"pixel_1,pixel_2,..."的表头 header = ','.join([f'pixel_{i+1}' for i in range(total_pixels)]) # 创建文件并写入表头 with open(csv_path, 'w') as f: f.write(header + '\n') # 第二步:循环写入所有图片数据 for img_name in os.listdir(IMG_DIR): img_path = os.path.join(IMG_DIR, img_name) img_array = cv2.imread(img_path, cv2.IMREAD_COLOR) # 将图片转为1行多列的数组(无需转置,直接flatten后reshape即可) flattened_img = img_array.flatten().reshape(1, -1) # 以追加二进制模式写入数据 with open(csv_path, 'ab') as f: np.savetxt(f, flattened_img, fmt='%d', delimiter=",")
方案2:一次性写入所有数据(适合小数据量)
先把所有图片数据收集到一个numpy数组中,然后一次性写入文件,这样表头只会被添加一次,代码更简洁。
import os import cv2 import numpy as np IMG_DIR = 'path to the images' csv_path = 'Data.csv' # 收集所有图片的扁平化数据 all_image_data = [] for img_name in os.listdir(IMG_DIR): img_path = os.path.join(IMG_DIR, img_name) img_array = cv2.imread(img_path, cv2.IMREAD_COLOR) all_image_data.append(img_array.flatten()) # 转换为numpy二维数组(每行对应一张图片的像素数据) data_array = np.array(all_image_data) # 生成表头 total_pixels = data_array.shape[1] header = ','.join([f'pixel_{i+1}' for i in range(total_pixels)]) # 一次性写入文件,表头仅添加一次 np.savetxt(csv_path, data_array, fmt='%d', delimiter=",", header=header, comments='')
方案对比
- 方案1:不会占用过多内存,适合图片数量多、单张图片尺寸大的场景。
- 方案2:代码更简洁易读,但会把所有数据加载到内存中,适合数据量较小的场景。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

