从 Arduino 将新数据写入 Python 中的 csv 文件

Posted

技术标签:

【中文标题】从 Arduino 将新数据写入 Python 中的 csv 文件【英文标题】:Write new data in to csv file in Python from an Arduino 【发布时间】:2021-09-26 05:00:54 【问题描述】:

我每秒都从 Arduino 接收数据,但我无法保存它,它将连续数据写入 csv 文件的同一单元格中,并且每次获取新值时都会对其进行更改。 我正在尝试使用 newline='' 和 write 行,但不起作用。

valueenc = (value)
                print("Valueencoded", valueenc)
                #print("Message received: "  + valueenc)
                f = open(f'root_path/Desktop/microphone_dump.csv','w+', newline ='')
                #f.write(valueenc)
                with f:
                    write = csv.writer(f) 
                    write.writerows(valueenc)

【问题讨论】:

可能只打开一次文件 - 在开始时 - 不要关闭它。 O 可能使用模式a 进行追加。我没有使用工作方式模式w+,但模式w 会删除以前的内容。 valueenc 中有什么? writerows 需要像 [ [ "row1-col1" , "row1-col2"], [ "row2-col1" , "row2-col2"] ] 那样带有行的列表(也是列表)。 【参考方案1】:

问题可以使模式w+(打开文件时删除所有数据)和with f:关闭文件。

我看到了两种可能的解决方案:

首先:只打开一次文件 - 在开始时 - 只在最后关闭一次。

# at start
f = open(f'root_path/Desktop/microphone_dump.csv', 'w+')

# ... code ...

valueenc = value
print("Valueencoded", valueenc)
write = csv.writer(f) 
write.writerows(valueenc)

# ... code ...

# at the end
f.close()

但程序出错时可能会丢失数据。

第二种:使用模式a追加数据

# ... code ...

valueenc = value
print("Valueencoded", valueenc)

with open(f'root_path/Desktop/microphone_dump.csv', 'a') as f:
    write = csv.writer(f) 
    write.writerows(valueenc)

# ... code ...

而且你可以在写入后直接使用with关闭文件。


编辑:

如果你只想写一行有两个值,那么你应该使用writerow,名称中不带字符s

with open(f'root_path/Desktop/microphone_dump.csv', 'a') as f:
    write = csv.writer(f) 
    write.writerow( [value1, value2] )  # without `s` in name `writerow`

如果你有很多行,那么你可以使用writerows

rows = [
   [value1, value2],   # row 1
   [value3, value4],   # row 2
]

with open(f'root_path/Desktop/microphone_dump.csv', 'a') as f:
    write = csv.writer(f) 
    write.writerows( rows )  # with `s` in name `writerows`

顺便说一句:

即使对于行中的单个值,您也必须使用列表

    write.writerow( [value1] )  # without `s` in name 

rows = [
   [value1],   # row 1
   [value2],   # row 2
]

    write.writerows( rows )  # with `s` in name `writerows`

【讨论】:

现在我有 value1 和 value 2,我想添加不同的单元格,但我正在尝试使用此代码行:file.write(value1, value2 + "\\n") #write data with a newline 但它不起作用。帮助 如果你只有一行,那么你需要write.writerow( [value1, value2] )。它必须是writerow,名称中没有字符s。而标准的write 只需要一个参数——一个字符串——text = str(value1) + "," + str(value2) + "\n" 和后来的file.write( text )。但是为此使用模块csv 更安全。 我添加了关于写入多行和在行中写入单个元素的信息【参考方案2】:

就是这样:

file = open(f'root_path/Desktop/test.csv', "a")
                print("Created file")
                file = open(f'root_path/Desktop/test.csv', "a") #append the data to the file
                file.write(valueenc + "\n") #write data with a newline
                #close out the file
                file.close()

【讨论】:

以上是关于从 Arduino 将新数据写入 Python 中的 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何通过usb端口通信从arduino将串行数据写入phpmyadmin

使用 Python 从 Arduino 读取字节

无法使用 qtserial 将数据写入 Arduino

在 Windows 上使用 pyserial 将串行数据写入 Arduino

arduino中怎么在一个命令下加另一个命令

我如何从Arduino写入CMD?