使用数组数组从Python创建CSV时出现问题

时间:2018-07-15 02:39:19

标签: python arrays csv

所以我有一个python,它从各种DAQ单元中收集数据点,而我要做的就是将它们吐到CSV中。我的代码可以完美地与示例数组配合使用,但是现在我无法继续使用它。

这就是我所拥有的:

with open(FileName, "w") as output:
    writer = csv.writer(output, delimiter = ',')
    writer.writerow(Header)
    i = 0
    TotalRuns = NumTestCycles
    while i < TotalRuns:
        ExportLine = RecordedData[i]
        writer.writerow(ExportLine)
        i = i + 1

现在,此代码为writer.writerow(ExportLine)产生“可迭代”错误。

因此,我将ExportLine包装在[]中,并生成我的CSV,但是每一行都显示为

[232, 233, 234, 235, 236, 237]
在每个单元格中

,而不是每个单元格中的单个数字。

我的阵列设置为

RecordedData = [[232,233,234,235,236,237],[232,233,234,235,236,237]]

我想要的只是我的excel工作表看起来像这样:

Title 1 | Title 2 | Title 3 | Title 4 | Title 5 | Title 6
----------------------------------------------------------
  232   |   233   |   234   |   235   |   236   |   237
----------------------------------------------------------
  232   |   233   |   234   |   235   |   236   |   237

我在这里想念什么?为什么用我的字符串数组而不是数字数组正确地吐出一行?

我已经尝试过for循环方法,它只会在每个单元格中产生一个带有子数组的大量行。我尝试了writer.writerows(RecordedData),它只产生最后一个数据点...作为一个单元格中的数组...

我在这里撞墙。

2 个答案:

答案 0 :(得分:0)

这对我有用。

请注意,在newline=''块中添加open可以防止在文件的每一行之间添加空白行。

import csv

RecordedData = [[232,233,234,235,236,237],[232,233,234,235,236,237]]
Header = 'Title 1', 'Title 2', 'Title 3', 'Title 4', 'Title 5', 'Title 6' 
with open('test.csv', "w", newline='') as csv_file:
        writer = csv.writer(csv_file, delimiter=',')
        i = 0
        writer.writerow(Header)
        TotalRuns = 1  #Changed to assumed NumTestCycles value from example data give
        while i <= TotalRuns:
            ExportLine = RecordedData[i]
            writer.writerow(ExportLine)
            i += 1

Excel的输出:

   A    |    B    |    C    |    D    |    E    |    F
----------------------------------------------------------
Title 1 | Title 2 | Title 3 | Title 4 | Title 5 | Title 6
----------------------------------------------------------
  232   |   233   |   234   |   235   |   236   |   237
----------------------------------------------------------
  232   |   233   |   234   |   235   |   236   |   237

*已编辑以包含标题行

*编辑2,您也可以在遍历列表时尝试使用.writerows(),这样可以解决您的错误。

import csv

RecordedData = [[232,233,234,235,236,237],[232,233,234,235,236,237]]
Header = 'Title 1', 'Title 2', 'Title 3', 'Title 4', 'Title 5', 'Title 6' 
with open('test.csv', "w", newline='') as csv_file:
    writer = csv.writer(csv_file, delimiter=',')
    writer.writerow(Header)
    TotalRuns = 1  #Changed to assumed NumTestCycles value from example data give
    writer.writerows(RecordedData)

答案 1 :(得分:0)

所以我知道了。上面显示的Pete代码(带有writerows)是完美的。它解决了将整个阵列放在一个单元中的时髦问题。产生可迭代错误的原因与代码无关。实际上,我有点怀疑每个单元中的数组也可能不是代码,但是我懒得回过头来检查一下,因为它现在可以工作了。问题是时机。

我将DAQ记录过程打包成一个基于计时器的while循环。用户输入测试的总时间和他们想要进行测量的时间间隔。循环以总时间作为其性能指标,并在每个循环的开始时检查经过时间,并且是否在间隔时间范围内,将数据从DAQ记录到数组中。

记录DAQ数据的整个过程显然需要一些时间。如果用户输入的间隔少于3秒(我进行了一些测试),则该程序将在一个周期进入DAQ记录,而到它出来时,它错过了下一个记录的窗口,因此跳过了该记录。基本上,它每隔一个周期(或更少)记录一次。

这是一个问题,因为我必须使用

初始化数组
RecordedData = [0 for i in range(1, NumTestCycles)]

这意味着我首先要有一个充满零的数组。由于时序问题导致它每隔一个周期进行记录,因此数组的一半在到达CSV导出时仍为零。 CSV可以很好地拉出该数组的数组,但随后它会变为零,并弹出“可迭代的期望值,而不是int”错误,因为它希望得到一个数组并得到一个零。

我是偶然发现的,但是现在我知道,如果将间隔时间设置为4秒或更长时间,就不会出现错误,并且我得到了一个完美的文件。

谢谢您的帮助!