Python如何将三维数组按列正确写入CSV文件
问题根因
你的代码存在两个核心问题:
- 最内层循环每次调用
hrd.writerow([str(val)])时,仅传入了单个数值,相当于每一行只写1列内容,直接导致所有数值全部落在CSV第一列。 - 循环逻辑完全是按单个值逐行输出,没有按「每列对应一个通道的所有采样值、每行对应所有通道同位置采样值」的结构做数据聚合,和你需要的8列输出结构完全不匹配。
另外原代码存在缩进错误:sensorBoard = [0, 1] 行没有和if __name__ == "__main__":块内的其他代码保持缩进一致,运行会直接抛语法错误。
正确实现
核心逻辑调整:
- 先聚合所有8个通道的一维数据列表,每个列表对应CSV的一列(前4列来自第一块传感板,后4列来自第二块传感板)
- 利用
zip(*列列表)按索引位置跨行聚合,每次取出所有列同一位置的数值组成完整行,一次性写入 - 表头直接通过csv writer写入,避免手动拼接字符串引入格式错误
完整可运行代码:
import json import csv from os import walk from os import path import matplotlib.pyplot as plt import numpy as np from datetime import datetime if __name__ == "__main__": # 你解析JSON得到的三维数组 sensorTest = [[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]], [[13, 14, 15], [16, 17, 18], [19, 20, 21], [22, 23, 24]]] sensorBoard = [0, 1] with open("./Data/sensorData.csv", "w", encoding='utf8', newline='') as csvfile: hrd = csv.writer(csvfile) # 写入表头 hrd.writerow(["C1","C2","C3","C4","C5","C6","C7","C8"]) # 收集所有列:两块板各4个通道,共8列 all_columns = [] for board in sensorBoard: for channel_data in sensorTest[board]: all_columns.append(channel_data) # 按行聚合写入 for row in zip(*all_columns): hrd.writerow(row)
若后续不同通道的采样值长度不一致,可导入
itertools.zip_longest替换zip,缺失值会自动填充为空,避免长度截断问题。
输出结果
运行后生成的CSV内容如下,完全实现分列存储的要求:
C1,C2,C3,C4,C5,C6,C7,C8 1,4,7,10,13,16,19,22 2,5,8,11,14,17,20,23 3,6,9,12,15,18,21,24
内容的提问来源于stack exchange,提问作者embedtime
相关产品推荐
相关产品推荐

