如何用Python CSV Writer将img_id与特征数组合并为单行写入CSV
解决CSV写入时img_id与特征数组同行的问题
你的问题根源很清晰——当前代码里分别调用了两次writer.writerow(),所以img_id和特征数组会被写入两行。要让它们出现在同一行,只需要把这两部分内容合并成一个单一的可迭代序列,再传给writer.writerow()就可以了。
修改后的完整代码
import os import csv import numpy as np # 假设feature_io是你已导入的特征读取模块 path = "/home/dir" listing = os.listdir(path) # 把文件打开逻辑放在循环外,避免重复打开/关闭文件,提升效率 with open("output_0.csv", "a") as f: writer = csv.writer(f) for file in listing: path_img_ext = os.path.join(path, file) data_read = feature_io.ReadFromFile(path_img_ext) base = os.path.basename(file) img_id = os.path.splitext(base)[0] f_descriptor = data_read[2] feature_flat = f_descriptor.flatten() # 核心操作:将img_id作为第一个元素,拼接特征数组的所有元素 row_data = [img_id] + feature_flat.tolist() writer.writerow(row_data)
关键细节说明
- 合并行数据:
[img_id] + feature_flat.tolist()是解决问题的核心——把单值的img_id包装成列表,再和转成普通列表的特征数组合并,得到一个包含所有元素的一维列表,这样writerow就会把所有内容写入同一行。 - 移除无效转置:一维数组的转置操作(
np.array(feature_flat).T)不会改变其结构,完全可以省略这一步,直接使用feature_flat即可。 - 优化文件操作:把文件打开的
with块放在循环外部,避免每次循环都重复执行文件打开/关闭操作,既提升效率也更规范。
你之前尝试zip或concatenate没成功,大概率是因为没处理好img_id的格式——zip要求两个可迭代对象长度匹配,而img_id是单值,自然无法匹配;concatenate则要求数据类型统一,直接拼接字符串和数组会报错,用列表合并的方式反而更直接简单。
内容的提问来源于stack exchange,提问作者New bie
相关产品推荐
相关产品推荐

