【问题标题】:Continuously write data from a list into a CSV file连续将列表中的数据写入 CSV 文件
【发布时间】:2017-10-30 13:46:04
【问题描述】:

我正在尝试让我的 python 脚本继续写入一个 .CSV 文件,而对于 python,我是初学者。

我尝试关注这个有类似问题但没有成功的人: Writing List of Strings to Excel CSV File in Python

我目前正在尝试保存包含温度、湿度和时间的传感器数据列表,代码当前如下所示:

def writeDataToFile():
    sensorData = []
    sensorData = getSensorData()


    with open("/home/pi/Documents/Python Projects/CSV-files/sensor_data.csv", 'w') as csv_file:
        writer = csv.writer(csv_file, delimiter=',')
        writer.writerows(sensorData)

我得到的错误是:interable expected, not int 所以第一个数据值存储在我假设的 int 中?

我习惯于在 java 中定义类型,但在这里你只需键入变量,嗯,是的。

我尝试了 writer.writerow(sensorData) 并且它可以正常工作,但正如您可能已经预料到的那样,它只写入一行数据。

其余代码在 while true 循环中运行,它不断将数据存储到列表中。

如何让这个函数继续写入我的 csv 文件,并在我的循环继续运行时添加越来越多的内容?

getSensorData 函数:

def getSensorData():
    sensorData = []

    temperature = getTemperatureFromSensor()
    humidity = getHumidityFromSensor()
    time = getCurrentFormatedTimestamp()

    sensorData.append(temperature)
    sensorData.append(humidity)
    sensorData.append(time)

    return sensorData

所以我试着简单地打印出列表,它完全按照我的意愿去做:

[29, 21, '2017-10-30 15:02:47']

[29, 21, '2017-10-30 15:02:52']

[29, 22, '2017-10-30 15:02:57']

[29, 21, '2017-10-30 15:03:02']

[28, 21, '2017-10-30 15:03:07']

[28, 21, '2017-10-30 15:03:13']

等等,这基本上就是我想要存储到 csv 中的内容

【问题讨论】:

  • 我们可以看看你的getSensorData()函数吗?
  • IIUC,问题是您以写入模式打开文件w,这会完全擦除所有现有内容。您应该以附加模式打开。看来getSensorData() 将返回一个int,因此每次调用该方法时,都需要writerow 该值。
  • 好的,所以writerows 期望您传递一个嵌套列表,其中每个内部列表代表一行。如果您传递一个列表,它将在索引 0 处找到一个 int 值,而实际上它期望一个表示第一行的列表。这就是错误的来源。你应该使用writerow。这是我之前评论的补充;每次打开文件时,您都需要追加模式以不覆盖以前的数据。
  • @roganjosh 你应该把它放在答案中

标签: python csv raspberry-pi raspbian


【解决方案1】:

csv 模块的writerows 方法需要一个嵌套列表,其中每个内部列表代表单行的数据。在您的情况下,传递一个平面列表,它反而在第 0 个索引处找到一个 int 值,而它期望第一行的内部列表。这解释了错误消息。

因此,您应该在每次调用您的方法时使用writerow。但是,以写入模式('w')打开文件每次都会删除文件的所有内容。因此,您需要以附加模式打开文件。一个玩具例子:

import csv

def write_csv(data):
    with open('example.csv', 'a') as outfile:
        writer = csv.writer(outfile)
        writer.writerow(data)

for x in range(5):
    write_csv([x, x+1])

【讨论】:

  • 我觉得自己好蠢……哈哈,我想我需要多学习一点python。
  • @Patt089 不用担心,它会随着时间而来。请注意,在 Python 中我们一般不会像 Java 那样使用驼峰式大小写,函数名是小写的,并用下划线分隔;见PEP8。如果您觉得这个答案已经解决了您的问题,如果您能mark it as correct,我将不胜感激。
  • 我正在尝试通过您的示例对其进行修改。现在我知道我的方法需要 1 个参数,而我给出了 0。但我敢打赌,我会查找并返回这里并将其标记为正确,一旦我设法解决了这个新错误跨度>
  • @Patt089 它在抱怨什么方法?根据我的回答,您需要进行的唯一更改应该是将writerows 更改为writerow 并将w 更改为a
  • @Patt089 您是否在您的一个函数(即def writeDataToFile(data)def getSensorData(data):)上创建了一个名为data 的参数?您无需这样做,这只是我的示例的一部分,它显示了附加到不断打开的 CSV 的一般原则。
猜你喜欢
  • 1970-01-01
  • 2020-06-01
  • 2016-09-26
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
相关资源
最近更新 更多