不断将列表中的数据写入CSV文件

5
我正在尝试让我的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)

我收到的错误是:期望可迭代对象,而不是整数。所以第一个数据值被存储在一个整数中,我猜是这样吧?
我习惯于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() 函数吗? - scharette
1
据我所知,问题在于您正在以写入模式“w”打开文件,这将完全删除所有现有内容。您应该以追加模式打开。看起来getSensorData()将返回一个int,因此每次调用该方法时,您都需要writerow该值。 - roganjosh
2
好的,所以writerows期望你传递一个嵌套列表,其中每个内部列表代表一行。如果你传递一个单独的列表,它会在索引0处找到一个int值,而实际上它期望的是代表第一行的列表。这就是错误的来源。你应该使用writerow。这是我之前评论的补充;你需要使用追加模式来避免每次打开文件时覆盖先前的数据。 - roganjosh
@roganjosh 你应该把那个放在答案里。 - jadsq
1个回答

3
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])

@Patt089 不用担心,这需要时间。请注意,在Python中,我们通常不使用像Java那样的驼峰命名法,函数名是小写的并且用下划线分隔;详见PEP8。如果你认为这个答案解决了你的问题,我将非常感激你能够标记为正确答案 - roganjosh
我正在尝试在你的示例上进行修改。现在我的方法需要1个参数,但我没有给出任何参数。但这只是小问题,我会查找并回来解决这个新错误,然后将其标记为正确。 - Patt089
@Patt089 它在抱怨哪个方法?根据我的回答,你需要做的唯一更改是将 writerows 更改为 writerow 并将 w 更改为 a - roganjosh
@Patt089,你在一个函数中创建了一个名为 data 的参数吗?例如:def writeDataToFile(data) 或者 def getSensorData(data):?其实并不需要这样做,这只是我的示例的一部分,展示了在不间断打开的 CSV 文件中进行追加的一般原则。 - roganjosh
哦,我也采用了你代码的后半部分,在那里你通过write_csv进行了迭代,然后我意识到我没有通过我的参数传递任何东西,所以我将其删除了,现在它可以工作了!非常感谢你,Rogan! - Patt089
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接